diff --git a/Config/SVTQPFile.txt b/Config/SVTQPFile.txt index 328788ea8..803f5cbd8 100644 --- a/Config/SVTQPFile.txt +++ b/Config/SVTQPFile.txt @@ -1,4 +1,4 @@ -# Copyright(c) 2018 Intel Corporation +# Copyright(c) 2018 Intel Corporation # SPDX-License-Identifier: BSD-2-Clause-Patent #====================== QP File ====================== @@ -17,4 +17,4 @@ 27 28 29 -30 \ No newline at end of file +30 diff --git a/NOTICES.md b/NOTICES.md index 3e45555d4..09ed8b020 100644 --- a/NOTICES.md +++ b/NOTICES.md @@ -8,5 +8,5 @@ Intel disclaims all express and implied warranties, including without limitation The products and services described may contain defects or errors known as errata which may cause deviations from published specifications. Current characterized errata are available on request. No product or component can be absolutely secure. This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice. Contact your Intel representative to obtain the latest forecast, schedule, specifications and roadmaps. Intel, the Intel logo, Intel Core, Intel Xeon, and others are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries. -*Other names and brands may be claimed as the property of others. +*Other names and brands may be claimed as the property of others. Copyright 2019 Intel Corporation diff --git a/Source/App/EbAppContext.h b/Source/App/EbAppContext.h index 666455d5b..cd6001aac 100644 --- a/Source/App/EbAppContext.h +++ b/Source/App/EbAppContext.h @@ -30,8 +30,8 @@ typedef struct EbAppContext_s { EB_BUFFERHEADERTYPE *streamBufferPool; EB_BUFFERHEADERTYPE *reconBuffer; - // Instance Index - uint8_t instanceIdx; + // Instance Index + uint8_t instanceIdx; } EbAppContext_t; @@ -42,4 +42,4 @@ typedef struct EbAppContext_s { extern EB_ERRORTYPE InitEncoder(EbConfig_t *config, EbAppContext_t *callbackData, uint32_t instanceIdx); extern EB_ERRORTYPE DeInitEncoder(EbAppContext_t *callbackDataPtr, uint32_t instanceIndex); -#endif // EbAppContext_h \ No newline at end of file +#endif // EbAppContext_h diff --git a/Source/App/EbAppFifo.c b/Source/App/EbAppFifo.c index 5ca15fe4f..757e7b3e5 100644 --- a/Source/App/EbAppFifo.c +++ b/Source/App/EbAppFifo.c @@ -94,274 +94,274 @@ invoke_safe_str_constraint_handler(const char *msg, void *ptr, errno_t error) { - if (NULL != str_handler) { - str_handler(msg, ptr, error); - } - else { - sl_default_handler(msg, ptr, error); - } + if (NULL != str_handler) { + str_handler(msg, ptr, error); + } + else { + sl_default_handler(msg, ptr, error); + } } void ignore_handler_s(const char *msg, void *ptr, errno_t error) { - (void)msg; - (void)ptr; - (void)error; - sldebug_printf("IGNORE CONSTRAINT HANDLER: (%u) %s\n", error, - (msg) ? msg : "Null message"); - return; + (void)msg; + (void)ptr; + (void)error; + sldebug_printf("IGNORE CONSTRAINT HANDLER: (%u) %s\n", error, + (msg) ? msg : "Null message"); + return; } EXPORT_SYMBOL(ignore_handler_s) errno_t strncpy_ss(char *dest, rsize_t dmax, const char *src, rsize_t slen) { - rsize_t orig_dmax; - char *orig_dest; - const char *overlap_bumper; - - if (dest == NULL) { - invoke_safe_str_constraint_handler("strncpy_ss: dest is null", - NULL, ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (dmax == 0) { - invoke_safe_str_constraint_handler("strncpy_ss: dmax is 0", - NULL, ESZEROL); - return RCNEGATE(ESZEROL); - } - - if (dmax > RSIZE_MAX_STR) { - invoke_safe_str_constraint_handler("strncpy_ss: dmax exceeds max", - NULL, ESLEMAX); - return RCNEGATE(ESLEMAX); - } - - /* hold base in case src was not copied */ - orig_dmax = dmax; - orig_dest = dest; - - if (src == NULL) { - handle_error(orig_dest, orig_dmax, (char*) ("strncpy_ss: " - "src is null"), - ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (slen == 0) { - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " - "slen is zero"), - ESZEROL); - return RCNEGATE(ESZEROL); - } - - if (slen > RSIZE_MAX_STR) { - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " - "slen exceeds max"), - ESLEMAX); - return RCNEGATE(ESLEMAX); - } - - - if (dest < src) { - overlap_bumper = src; - - while (dmax > 0) { - if (dest == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - if (slen == 0) { - /* - * Copying truncated to slen chars. Note that the TR says to - * copy slen chars plus the null char. We null the slack. - */ - *dest = '\0'; - return RCNEGATE(EOK); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - slen--; - dest++; - src++; - } - - } - else { - overlap_bumper = dest; - - while (dmax > 0) { - if (src == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)( "strncpy_s: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - if (slen == 0) { - /* - * Copying truncated to slen chars. Note that the TR says to - * copy slen chars plus the null char. We null the slack. - */ - *dest = '\0'; - return RCNEGATE(EOK); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - slen--; - dest++; - src++; - } - } - - /* - * the entire src was not copied, so zero the string - */ - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: not enough " - "space for src"), - ESNOSPC); - return RCNEGATE(ESNOSPC); + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; + + if (dest == NULL) { + invoke_safe_str_constraint_handler("strncpy_ss: dest is null", + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (dmax == 0) { + invoke_safe_str_constraint_handler("strncpy_ss: dmax is 0", + NULL, ESZEROL); + return RCNEGATE(ESZEROL); + } + + if (dmax > RSIZE_MAX_STR) { + invoke_safe_str_constraint_handler("strncpy_ss: dmax exceeds max", + NULL, ESLEMAX); + return RCNEGATE(ESLEMAX); + } + + /* hold base in case src was not copied */ + orig_dmax = dmax; + orig_dest = dest; + + if (src == NULL) { + handle_error(orig_dest, orig_dmax, (char*) ("strncpy_ss: " + "src is null"), + ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (slen == 0) { + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " + "slen is zero"), + ESZEROL); + return RCNEGATE(ESZEROL); + } + + if (slen > RSIZE_MAX_STR) { + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " + "slen exceeds max"), + ESLEMAX); + return RCNEGATE(ESLEMAX); + } + + + if (dest < src) { + overlap_bumper = src; + + while (dmax > 0) { + if (dest == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + if (slen == 0) { + /* + * Copying truncated to slen chars. Note that the TR says to + * copy slen chars plus the null char. We null the slack. + */ + *dest = '\0'; + return RCNEGATE(EOK); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + slen--; + dest++; + src++; + } + + } + else { + overlap_bumper = dest; + + while (dmax > 0) { + if (src == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)( "strncpy_s: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + if (slen == 0) { + /* + * Copying truncated to slen chars. Note that the TR says to + * copy slen chars plus the null char. We null the slack. + */ + *dest = '\0'; + return RCNEGATE(EOK); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + slen--; + dest++; + src++; + } + } + + /* + * the entire src was not copied, so zero the string + */ + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: not enough " + "space for src"), + ESNOSPC); + return RCNEGATE(ESNOSPC); } EXPORT_SYMBOL(strncpy_ss) errno_t strcpy_ss(char *dest, rsize_t dmax, const char *src) { - rsize_t orig_dmax; - char *orig_dest; - const char *overlap_bumper; - - if (dest == NULL) { - invoke_safe_str_constraint_handler((char*)("strcpy_ss: dest is null"), - NULL, ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (dmax == 0) { - invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax is 0"), - NULL, ESZEROL); - return RCNEGATE(ESZEROL); - } - - if (dmax > RSIZE_MAX_STR) { - invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax exceeds max"), - NULL, ESLEMAX); - return RCNEGATE(ESLEMAX); - } - - if (src == NULL) { - *dest = '\0'; - invoke_safe_str_constraint_handler((char*)("strcpy_ss: src is null"), - NULL, ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (dest == src) { - return RCNEGATE(EOK); - } - - /* hold base of dest in case src was not copied */ - orig_dmax = dmax; - orig_dest = dest; - - if (dest < src) { - overlap_bumper = src; - - while (dmax > 0) { - if (dest == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - dest++; - src++; - } - - } - else { - overlap_bumper = dest; - - while (dmax > 0) { - if (src == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - dest++; - src++; - } - } - - /* - * the entire src must have been copied, if not reset dest - * to null the string. - */ - handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: not " - "enough space for src"), - ESNOSPC); - return RCNEGATE(ESNOSPC); + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; + + if (dest == NULL) { + invoke_safe_str_constraint_handler((char*)("strcpy_ss: dest is null"), + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (dmax == 0) { + invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax is 0"), + NULL, ESZEROL); + return RCNEGATE(ESZEROL); + } + + if (dmax > RSIZE_MAX_STR) { + invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax exceeds max"), + NULL, ESLEMAX); + return RCNEGATE(ESLEMAX); + } + + if (src == NULL) { + *dest = '\0'; + invoke_safe_str_constraint_handler((char*)("strcpy_ss: src is null"), + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (dest == src) { + return RCNEGATE(EOK); + } + + /* hold base of dest in case src was not copied */ + orig_dmax = dmax; + orig_dest = dest; + + if (dest < src) { + overlap_bumper = src; + + while (dmax > 0) { + if (dest == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + dest++; + src++; + } + + } + else { + overlap_bumper = dest; + + while (dmax > 0) { + if (src == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + dest++; + src++; + } + } + + /* + * the entire src must have been copied, if not reset dest + * to null the string. + */ + handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: not " + "enough space for src"), + ESNOSPC); + return RCNEGATE(ESNOSPC); } EXPORT_SYMBOL(strcpy_ss) rsize_t strnlen_ss(const char *dest, rsize_t dmax) { - rsize_t count; - - if (dest == NULL) { - return RCNEGATE(0); - } - - if (dmax == 0) { - invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax is 0"), - NULL, ESZEROL); - return RCNEGATE(0); - } - - if (dmax > RSIZE_MAX_STR) { - invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax exceeds max"), - NULL, ESLEMAX); - return RCNEGATE(0); - } - - count = 0; - while (*dest && dmax) { - count++; - dmax--; - dest++; - } - - return RCNEGATE(count); + rsize_t count; + + if (dest == NULL) { + return RCNEGATE(0); + } + + if (dmax == 0) { + invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax is 0"), + NULL, ESZEROL); + return RCNEGATE(0); + } + + if (dmax > RSIZE_MAX_STR) { + invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax exceeds max"), + NULL, ESLEMAX); + return RCNEGATE(0); + } + + count = 0; + while (*dest && dmax) { + count++; + dmax--; + dest++; + } + + return RCNEGATE(count); } EXPORT_SYMBOL(strnlen_ss) diff --git a/Source/App/EbAppInputy4m.c b/Source/App/EbAppInputy4m.c index eeaef6228..afed6515c 100644 --- a/Source/App/EbAppInputy4m.c +++ b/Source/App/EbAppInputy4m.c @@ -48,7 +48,7 @@ int32_t read_y4m_header(EbConfig_t *cfg) { /* get first line after YUV4MPEG2 */ fresult = fgets(buffer, sizeof(buffer), ptr_in); - if (fresult== NULL) { + if (fresult== NULL) { return EB_ErrorBadParameter; } diff --git a/Source/App/EbAppProcessCmd.c b/Source/App/EbAppProcessCmd.c index 112f01f49..5b012fd5f 100644 --- a/Source/App/EbAppProcessCmd.c +++ b/Source/App/EbAppProcessCmd.c @@ -765,7 +765,7 @@ static void ReadInputFrames( const uint32_t inputPaddedWidth = config->inputPaddedWidth; const uint32_t inputPaddedHeight = config->inputPaddedHeight; FILE *inputFile = config->inputFile; - uint8_t *ebInputPtr; + uint8_t *ebInputPtr; EB_H265_ENC_INPUT* inputPtr = (EB_H265_ENC_INPUT*)headerPtr->pBuffer; const EB_COLOR_FORMAT colorFormat = (EB_COLOR_FORMAT)config->encoderColorFormat; const uint8_t subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -1129,8 +1129,8 @@ APPEXITCONDITIONTYPE ProcessInputBuffer(EbConfig_t *config, EbAppContext_t *appC EbInjector(config->processedFrameCount, config->injectorFrameRate); } - totalBytesToProcessCount = (framesToBeEncoded < 0) ? -1 : (config->encoderBitDepth == 10 && config->compressedTenBitFormat == 1) ? - framesToBeEncoded * compressed10bitFrameSize: + totalBytesToProcessCount = (framesToBeEncoded < 0) ? -1 : (config->encoderBitDepth == 10 && config->compressedTenBitFormat == 1) ? + framesToBeEncoded * compressed10bitFrameSize: framesToBeEncoded * SIZE_OF_ONE_FRAME_IN_BYTES(inputPaddedWidth, inputPaddedHeight, colorFormat, is16bit); @@ -1314,7 +1314,7 @@ APPEXITCONDITIONTYPE ProcessOutputStreamBuffer( } } } - return return_value; + return return_value; } APPEXITCONDITIONTYPE ProcessOutputReconBuffer( EbConfig_t *config, diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c index a753646b8..c150b6799 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c @@ -16,35 +16,35 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( EB_U32 inputAreaWidth, // input parameter, input area width EB_U32 inputAreaHeight) // input parameter, input area height { - __m256i sum,sum2 ,xmm2, xmm1, sum1, xmm0 = _mm256_setzero_si256(); - __m128i upper, lower, mean = _mm_setzero_si128() ; - EB_U64 result; - xmm1=_mm256_sad_epu8( xmm0 ,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )); - xmm2= _mm256_sad_epu8(xmm0,_mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ) ; - sum1 = _mm256_add_epi16(xmm1, xmm2); - - inputSamples += 4 * inputStride; - - xmm1= _mm256_sad_epu8(xmm0,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )) ; - xmm2= _mm256_sad_epu8(xmm0, _mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ); - sum2 = _mm256_add_epi16(xmm1, xmm2); - + __m256i sum,sum2 ,xmm2, xmm1, sum1, xmm0 = _mm256_setzero_si256(); + __m128i upper, lower, mean = _mm_setzero_si128() ; + EB_U64 result; + xmm1=_mm256_sad_epu8( xmm0 ,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )); + xmm2= _mm256_sad_epu8(xmm0,_mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ) ; + sum1 = _mm256_add_epi16(xmm1, xmm2); + + inputSamples += 4 * inputStride; + + xmm1= _mm256_sad_epu8(xmm0,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )) ; + xmm2= _mm256_sad_epu8(xmm0, _mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ); + sum2 = _mm256_add_epi16(xmm1, xmm2); + sum = _mm256_add_epi16(sum1, sum2); - upper = _mm256_extractf128_si256(sum,1) ; //extract upper 128 bit - upper = _mm_add_epi32(upper, _mm_srli_si128(upper, 8)); // shift 2nd 16 bits to the 1st and sum both - - lower = _mm256_extractf128_si256(sum,0) ; //extract lower 128 bit - lower = _mm_add_epi32(lower, _mm_srli_si128(lower, 8)); // shift 2nd 16 bits to the 1st and sum both - - mean = _mm_add_epi32(lower,upper); - - (void)inputAreaWidth; + upper = _mm256_extractf128_si256(sum,1) ; //extract upper 128 bit + upper = _mm_add_epi32(upper, _mm_srli_si128(upper, 8)); // shift 2nd 16 bits to the 1st and sum both + + lower = _mm256_extractf128_si256(sum,0) ; //extract lower 128 bit + lower = _mm_add_epi32(lower, _mm_srli_si128(lower, 8)); // shift 2nd 16 bits to the 1st and sum both + + mean = _mm_add_epi32(lower,upper); + + (void)inputAreaWidth; (void)inputAreaHeight; - + result = (EB_U64)_mm_cvtsi128_si32(mean) << 2; return result; - -} + +} /********************************************************************************************************************************/ void ComputeIntermVarFour8x8_AVX2_INTRIN( @@ -57,15 +57,15 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( __m256i ymm1, ymm2, ymm3, ymm4, ymm_sum1, ymm_sum2, ymm_FinalSum,ymm_shift,/* ymm_blockMeanSquared*///, ymm_in,ymm_in_2S,ymm_in_second,ymm_in_2S_second,ymm_shiftSquared,ymm_permute8, ymm_result,ymm_blockMeanSquaredlow,ymm_blockMeanSquaredHi,ymm_inputlo,ymm_inputhi; - + __m128i ymm_blockMeanSquaredlo,ymm_blockMeanSquaredhi,ymm_resultlo,ymm_resulthi; - + __m256i ymm_zero = _mm256_setzero_si256(); __m128i xmm_zero = _mm_setzero_si128(); ymm_in = _mm256_loadu_si256((__m256i *) inputSamples); ymm_in_2S = _mm256_loadu_si256((__m256i *)(inputSamples + 2 * inputStride)); - + ymm1 = _mm256_sad_epu8(ymm_in, ymm_zero); ymm2 = _mm256_sad_epu8(ymm_in_2S, ymm_zero); @@ -88,33 +88,33 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( _mm256_storeu_si256((__m256i *)(meanOf8x8Blocks), ymm_FinalSum); /*******************************Squared Mean******************************/ - + ymm_inputlo = _mm256_unpacklo_epi8(ymm_in, ymm_zero); ymm_inputhi = _mm256_unpackhi_epi8(ymm_in, ymm_zero); - + ymm_blockMeanSquaredlow = _mm256_madd_epi16(ymm_inputlo, ymm_inputlo); ymm_blockMeanSquaredHi = _mm256_madd_epi16(ymm_inputhi, ymm_inputhi); ymm_inputlo = _mm256_unpacklo_epi8(ymm_in_2S, ymm_zero); - ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_2S, ymm_zero); - + ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_2S, ymm_zero); + ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_madd_epi16(ymm_inputlo, ymm_inputlo)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_madd_epi16(ymm_inputhi, ymm_inputhi)); ymm_inputlo = _mm256_unpacklo_epi8(ymm_in_second, ymm_zero); - ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_second, ymm_zero); - + ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_second, ymm_zero); + ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_madd_epi16(ymm_inputlo, ymm_inputlo)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_madd_epi16(ymm_inputhi, ymm_inputhi)); ymm_inputlo = _mm256_unpacklo_epi8(ymm_in_2S_second, ymm_zero); ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_2S_second, ymm_zero); - + ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_madd_epi16(ymm_inputlo, ymm_inputlo)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_madd_epi16(ymm_inputhi, ymm_inputhi)); ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_srli_si256(ymm_blockMeanSquaredlow, 8)); - ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_srli_si256(ymm_blockMeanSquaredHi, 8)); + ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_srli_si256(ymm_blockMeanSquaredHi, 8)); ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_srli_si256(ymm_blockMeanSquaredlow, 4)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_srli_si256(ymm_blockMeanSquaredHi, 4)); @@ -122,24 +122,24 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( ymm_permute8 = _mm256_set_epi32(0,0,0,0,0,0,4,0); ymm_blockMeanSquaredlow = _mm256_permutevar8x32_epi32(ymm_blockMeanSquaredlow,ymm_permute8/*8*/); ymm_blockMeanSquaredHi = _mm256_permutevar8x32_epi32(ymm_blockMeanSquaredHi,ymm_permute8); - + ymm_blockMeanSquaredlo = _mm256_extracti128_si256(ymm_blockMeanSquaredlow,0); //lower 128 ymm_blockMeanSquaredhi = _mm256_extracti128_si256(ymm_blockMeanSquaredHi,0); //lower 128 ymm_result = _mm256_unpacklo_epi32(_mm256_castsi128_si256(ymm_blockMeanSquaredlo),_mm256_castsi128_si256(ymm_blockMeanSquaredhi)); ymm_resultlo = _mm_unpacklo_epi64(_mm256_castsi256_si128(ymm_result),xmm_zero); ymm_resulthi = _mm_unpackhi_epi64(_mm256_castsi256_si128(ymm_result),xmm_zero); - - + + ymm_result = _mm256_set_m128i(ymm_resulthi,ymm_resultlo); - + ymm_permute8 = _mm256_set_epi32(7,5,6,4,3,1,2,0); ymm_result = _mm256_permutevar8x32_epi32(ymm_result,ymm_permute8); - + ymm_shiftSquared = _mm256_set1_epi64x (11 ); ymm_result = _mm256_sllv_epi64(ymm_result,ymm_shiftSquared); - + _mm256_storeu_si256((__m256i *)(meanOfSquared8x8Blocks), ymm_result); diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h index a31682186..70a953eca 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h @@ -12,10 +12,10 @@ extern "C" { #endif EB_U64 ComputeMean8x8_AVX2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputStride, // input parameter, input stride - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputStride, // input parameter, input stride + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight); void ComputeIntermVarFour8x8_AVX2_INTRIN( EB_U8 * inputSamples, @@ -25,5 +25,5 @@ extern "C" { #ifdef __cplusplus } -#endif +#endif #endif diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c index 496be024f..7c7a3fbf0 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c @@ -14,164 +14,164 @@ #ifndef NON_AVX512_SUPPORT AVX512_FUNC_TARGET void BiPredAverageKernel_AVX512_INTRIN( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6; - __m256i xmm_avg1_256, xmm_avg3_256; - EB_U32 y; - - if (areaWidth > 16) - { - if (areaWidth == 24) - { - for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 32) - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)src0), _mm256_loadu_si256((__m256i*)src1)); - xmm_avg3_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)(src0 + src0Stride)), _mm256_loadu_si256((__m256i*)(src1 + src1Stride))); - - _mm256_storeu_si256((__m256i *) dst, xmm_avg1_256); - _mm256_storeu_si256((__m256i *) (dst + dstStride), xmm_avg3_256); - - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 48) - { - for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); - _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - - } - } - else - { - EB_U32 src0Stride1 = src0Stride << 1; - EB_U32 src1Stride1 = src1Stride << 1; - EB_U32 dstStride1 = dstStride << 1; - - __m512i xmm_avg1_512, xmm_avg3_512; - - for (EB_U32 y = 0; y < areaHeight; y += 2, src0 += src0Stride1, src1 += src1Stride1, dst += dstStride1) { - xmm_avg1_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)src0), _mm512_loadu_si512((__m512i *)src1)); - xmm_avg3_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)(src0 + src0Stride)), _mm512_loadu_si512((__m512i *)(src1 + src1Stride))); - - _mm512_storeu_si512((__m512i *)dst, xmm_avg1_512); - _mm512_storeu_si512((__m512i *)(dst + dstStride), xmm_avg3_512); - } - - } - } - else - { - if (areaWidth == 16) - { - for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 4) - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); - - *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); - *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 8) - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); - - xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); - *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - } + __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6; + __m256i xmm_avg1_256, xmm_avg3_256; + EB_U32 y; + + if (areaWidth > 16) + { + if (areaWidth == 24) + { + for (y = 0; y < areaHeight; y += 2) { + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 32) + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)src0), _mm256_loadu_si256((__m256i*)src1)); + xmm_avg3_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)(src0 + src0Stride)), _mm256_loadu_si256((__m256i*)(src1 + src1Stride))); + + _mm256_storeu_si256((__m256i *) dst, xmm_avg1_256); + _mm256_storeu_si256((__m256i *) (dst + dstStride), xmm_avg3_256); + + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 48) + { + for (y = 0; y < areaHeight; y += 2) { + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); + _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + + } + } + else + { + EB_U32 src0Stride1 = src0Stride << 1; + EB_U32 src1Stride1 = src1Stride << 1; + EB_U32 dstStride1 = dstStride << 1; + + __m512i xmm_avg1_512, xmm_avg3_512; + + for (EB_U32 y = 0; y < areaHeight; y += 2, src0 += src0Stride1, src1 += src1Stride1, dst += dstStride1) { + xmm_avg1_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)src0), _mm512_loadu_si512((__m512i *)src1)); + xmm_avg3_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)(src0 + src0Stride)), _mm512_loadu_si512((__m512i *)(src1 + src1Stride))); + + _mm512_storeu_si512((__m512i *)dst, xmm_avg1_512); + _mm512_storeu_si512((__m512i *)(dst + dstStride), xmm_avg3_512); + } + + } + } + else + { + if (areaWidth == 16) + { + for (y = 0; y < areaHeight; y += 2) { + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 4) + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); + + *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); + *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 8) + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); + + xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); + *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + } } #else diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h index b760f1aca..b85feacf5 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h @@ -13,26 +13,26 @@ extern "C" { #endif EB_U64 ComputeMean8x8_AVX2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputStride, // input parameter, input stride - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputStride, // input parameter, input stride + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight); void ComputeIntermVarFour8x8_AVX2_INTRIN( - EB_U8 * inputSamples, - EB_U16 inputStride, - EB_U64 * meanOf8x8Blocks, // mean of four 8x8 - EB_U64 * meanOfSquared8x8Blocks); + EB_U8 * inputSamples, + EB_U16 inputStride, + EB_U64 * meanOf8x8Blocks, // mean of four 8x8 + EB_U64 * meanOfSquared8x8Blocks); #ifndef NON_AVX512_SUPPORT void BiPredAverageKernel_AVX512_INTRIN( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); #else void BiPredAverageKernel_AVX2_INTRIN( EB_BYTE src0, @@ -47,5 +47,5 @@ void BiPredAverageKernel_AVX2_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif diff --git a/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h b/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h index 57091cd83..1bd4da18a 100644 --- a/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h @@ -12,68 +12,68 @@ extern "C" { #endif EB_U32 Compute24xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute32xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute40xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute48xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute56xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute64xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) void SadLoopKernel_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width, // input parameter, block width (N) - EB_U64 *bestSad, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter, - EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) - EB_S16 searchAreaWidth, - EB_S16 searchAreaHeight); + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width, // input parameter, block width (N) + EB_U64 *bestSad, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter, + EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) + EB_S16 searchAreaWidth, + EB_S16 searchAreaHeight); #ifdef NON_AVX512_SUPPORT void GetEightHorizontalSearchPointResults_8x8_16x16_PU_AVX2_INTRIN( @@ -100,6 +100,6 @@ void GetEightHorizontalSearchPointResults_32x32_64x64_PU_AVX2_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif // EbComputeSAD_AVX2_h diff --git a/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c index 9c5edbeec..d1ad3fc18 100644 --- a/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c @@ -67,9 +67,9 @@ void SadLoopKernel_AVX2_INTRIN( pRef = ref + j; ss3 = ss5 = _mm256_setzero_si256(); for (k=0; k> 4; // searchAreaWidth / 16; - - __m512i ss3sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), - _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; - __m512i ss7sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), - _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; - - const EB_U8 *pRef1 = ref; - - ss3 = ss7 = _mm256_setzero_si256(); - pSrc = src; - pRef = ref; - - for (k = 0; k < height; k += 2) - { - __m256i ref0temp, ref1temp, ref4temp, ref3temp; - - __m256i temp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)pSrc)), _mm_loadu_si128((__m128i*)(pSrc + srcStride)), 0x1); - ref0temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x( 0x0, 0x0, 0x0004000400040004, 0x0004000400040004)); - ref1temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0001000100010001, 0x0001000100010001, 0x0005000500050005, 0x0005000500050005)); - ref3temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0002000200020002, 0x0002000200020002, 0x0006000600060006, 0x0006000600060006)); - ref4temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0003000300030003, 0x0003000300030003, 0x0007000700070007, 0x0007000700070007)); - - __m512i ref1ftemp = _mm512_broadcast_i64x4(ref0temp); - __m512i ref2ftemp = _mm512_broadcast_i64x4(ref1temp); - __m512i ref3ftemp = _mm512_broadcast_i64x4(ref3temp); - __m512i ref4ftemp = _mm512_broadcast_i64x4(ref4temp); - - for (j = 0, pRef = pRef1; j < n; j++, pRef += 16) - { - __m256i ss0 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef ))), _mm_loadu_si128((__m128i*)(pRef + refStride )), 0x1); - __m256i ss1 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 8 ))), _mm_loadu_si128((__m128i*)(pRef + refStride + 8 )), 0x1); - ss2 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 16))), _mm_loadu_si128((__m128i*)(pRef + refStride + 16)), 0x1); - - __m512i ss1ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss0), ss1, 0x1); - __m512i ss2ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss1), ss2, 0x1); - - ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref1ftemp, ss1ftemp, 0x94)); - ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref2ftemp, ss1ftemp, 0xE9)); - ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref3ftemp, ss2ftemp, 0x94)); - ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref4ftemp, ss2ftemp, 0xE9)); - - } - - pSrc += 2 * srcStride; - pRef1 += 2 * refStride; - - } - - for (j = 0; j < n; j++) - { - //Code performing better then original code - __m512i result1 = _mm512_adds_epu16(ss3sum1_aaray[j], ss7sum1_aaray[j]); - __m256i ss5 = _mm512_castsi512_si256(result1); - __m256i ss6 = _mm512_extracti64x4_epi64(result1, 1); - __m128i s3cum = _mm_adds_epu16(_mm256_castsi256_si128(ss5), _mm256_extracti128_si256(ss5, 1)); - __m128i s7cum = _mm_adds_epu16(_mm256_castsi256_si128(ss6), _mm256_extracti128_si256(ss6, 1)); - s3cum = _mm_minpos_epu16(s3cum); - s7cum = _mm_minpos_epu16(s7cum); - temSum1 = _mm_extract_epi16(s3cum, 0); - if (temSum1 < lowSum) { - lowSum = temSum1; - xBest = (EB_S16)((16 * j) + _mm_extract_epi16(s3cum, 1)); - yBest = i; - } - - temSum1 = _mm_extract_epi16(s7cum, 0); - if (temSum1 < lowSum) { - lowSum = temSum1; - xBest = (EB_S16)((16 * j) + 8 + _mm_extract_epi16(s7cum, 1)); - yBest = i; - } - - } - - ref += srcStrideRaw; - } - } - else if (height <= 32) { - for (i = 0; i> 4; // searchAreaWidth / 16; + + __m512i ss3sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), + _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; + __m512i ss7sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), + _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; + + const EB_U8 *pRef1 = ref; + + ss3 = ss7 = _mm256_setzero_si256(); + pSrc = src; + pRef = ref; + + for (k = 0; k < height; k += 2) + { + __m256i ref0temp, ref1temp, ref4temp, ref3temp; + + __m256i temp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)pSrc)), _mm_loadu_si128((__m128i*)(pSrc + srcStride)), 0x1); + ref0temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x( 0x0, 0x0, 0x0004000400040004, 0x0004000400040004)); + ref1temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0001000100010001, 0x0001000100010001, 0x0005000500050005, 0x0005000500050005)); + ref3temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0002000200020002, 0x0002000200020002, 0x0006000600060006, 0x0006000600060006)); + ref4temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0003000300030003, 0x0003000300030003, 0x0007000700070007, 0x0007000700070007)); + + __m512i ref1ftemp = _mm512_broadcast_i64x4(ref0temp); + __m512i ref2ftemp = _mm512_broadcast_i64x4(ref1temp); + __m512i ref3ftemp = _mm512_broadcast_i64x4(ref3temp); + __m512i ref4ftemp = _mm512_broadcast_i64x4(ref4temp); + + for (j = 0, pRef = pRef1; j < n; j++, pRef += 16) + { + __m256i ss0 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef ))), _mm_loadu_si128((__m128i*)(pRef + refStride )), 0x1); + __m256i ss1 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 8 ))), _mm_loadu_si128((__m128i*)(pRef + refStride + 8 )), 0x1); + ss2 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 16))), _mm_loadu_si128((__m128i*)(pRef + refStride + 16)), 0x1); + + __m512i ss1ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss0), ss1, 0x1); + __m512i ss2ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss1), ss2, 0x1); + + ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref1ftemp, ss1ftemp, 0x94)); + ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref2ftemp, ss1ftemp, 0xE9)); + ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref3ftemp, ss2ftemp, 0x94)); + ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref4ftemp, ss2ftemp, 0xE9)); + + } + + pSrc += 2 * srcStride; + pRef1 += 2 * refStride; + + } + + for (j = 0; j < n; j++) + { + //Code performing better then original code + __m512i result1 = _mm512_adds_epu16(ss3sum1_aaray[j], ss7sum1_aaray[j]); + __m256i ss5 = _mm512_castsi512_si256(result1); + __m256i ss6 = _mm512_extracti64x4_epi64(result1, 1); + __m128i s3cum = _mm_adds_epu16(_mm256_castsi256_si128(ss5), _mm256_extracti128_si256(ss5, 1)); + __m128i s7cum = _mm_adds_epu16(_mm256_castsi256_si128(ss6), _mm256_extracti128_si256(ss6, 1)); + s3cum = _mm_minpos_epu16(s3cum); + s7cum = _mm_minpos_epu16(s7cum); + temSum1 = _mm_extract_epi16(s3cum, 0); + if (temSum1 < lowSum) { + lowSum = temSum1; + xBest = (EB_S16)((16 * j) + _mm_extract_epi16(s3cum, 1)); + yBest = i; + } + + temSum1 = _mm_extract_epi16(s7cum, 0); + if (temSum1 < lowSum) { + lowSum = temSum1; + xBest = (EB_S16)((16 * j) + 8 + _mm_extract_epi16(s7cum, 1)); + yBest = i; + } + + } + + ref += srcStrideRaw; + } + } + else if (height <= 32) { + for (i = 0; i (-1) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | - // > (-1) | > (-3) | <= (0) | a1 | -1 | 0 | -1 | - // > (-1) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | - // > (-1) | <= (-2) | <= (0) | a1 | -1 | 0 | -1 | - // <= (0) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | - // <= (0) | > (-3) | <= (0) | a0 | 0 | 0 | 0 | - // <= (0) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | - // <= (0) | <= (-2) | <= (0) | a0 | 0 | 0 | 0 | - - // *** 8 search points per position *** - - // ss0: Search Pos 0,4 for blocks 0,1,2,3 - // ss1: Search Pos 1,5 for blocks 0,1,2,3 - // ss2: Search Pos 2,6 for blocks 0,1,2,3 - // ss3: Search Pos 3,7 for blocks 0,1,2,3 - - ss4 = _mm256_cmpgt_epi32(ss0, ss1); - // not different SVT_LOG("%d\n", _mm_extract_epi32(_mm256_extracti128_si256(ss4, 0), 0)); // DEBUG - //ss4 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss1), _mm256_cmpeq_epi32(ss0, ss1)); - ss0 = _mm256_min_epi32(ss0, ss1); - ss5 = _mm256_cmpgt_epi32(ss2, ss3); - //ss5 = _mm256_or_si256(_mm256_cmpgt_epi32(ss2, ss3), _mm256_cmpeq_epi32(ss2, ss3)); - ss2 = _mm256_min_epi32(ss2, ss3); - ss5 = _mm256_sub_epi32(ss5, _mm256_set1_epi32(2)); // ss5-2 - - - // *** 4 search points per position *** - ss6 = _mm256_cmpgt_epi32(ss0, ss2); - //ss6 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss2), _mm256_cmpeq_epi32(ss0, ss2)); - ss0 = _mm256_min_epi32(ss0, ss2); - ss5 = _mm256_and_si256(ss5, ss6); // (ss5-2) & ss6 - ss4 = _mm256_andnot_si256(ss6, ss4); // ss4 & !ss6 - ss4 = _mm256_or_si256(ss4, ss5); // (ss4 & !ss6) | ((ss5-2) & ss6) - - // *** 2 search points per position *** - s0 = _mm_setzero_si128(); - s1 = _mm_setzero_si128(); - s2 = _mm_setzero_si128(); - s3 = _mm_setzero_si128(); - s4 = _mm_setzero_si128(); - s5 = _mm_setzero_si128(); - s6 = _mm_setzero_si128(); - s7 = _mm_setzero_si128(); - - // ss0 = 8 SADs, two search points for each 32x32 - // ss4 = 8 MVs, two search points for each 32x32 - // - // XY - // X: 32x32 block [0..3] - // Y: search position [0..1] - // Format: 00 10 20 30 01 11 21 31 - - // Each 128 bits contains 4 32x32 32bit block results + //32x32_0 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 0 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 1 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 2 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 3 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_01 = _mm_add_epi32(s0, s2); + sad_00 = _mm_add_epi32(s1, s3); + + //32x32_1 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 4 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 5 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 6 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 7 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_11 = _mm_add_epi32(s0, s2); + sad_10 = _mm_add_epi32(s1, s3); + + //32x32_2 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 8 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 9 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 10 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 11 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_21 = _mm_add_epi32(s0, s2); + sad_20 = _mm_add_epi32(s1, s3); + + //32x32_3 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 12 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 13 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 14 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 15 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_31 = _mm_add_epi32(s0, s2); + sad_30 = _mm_add_epi32(s1, s3); + + sad_0 = _mm_add_epi32(_mm_add_epi32(sad_00, sad_10), _mm_add_epi32(sad_20, sad_30)); + sad_1 = _mm_add_epi32(_mm_add_epi32(sad_01, sad_11), _mm_add_epi32(sad_21, sad_31)); + sad_0 = _mm_slli_epi32(sad_0, 1); + sad_1 = _mm_slli_epi32(sad_1, 1); + + bestSad64x64 = pBestSad64x64[0]; + bestMV64x64 = 0; + //sad_0 + temSum = _mm_extract_epi32(sad_0, 0); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + } + temSum = _mm_extract_epi32(sad_0, 1); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 1 * 4; + } + temSum = _mm_extract_epi32(sad_0, 2); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 2 * 4; + } + temSum = _mm_extract_epi32(sad_0, 3); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 3 * 4; + } + + //sad_1 + temSum = _mm_extract_epi32(sad_1, 0); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 4 * 4; + } + temSum = _mm_extract_epi32(sad_1, 1); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 5 * 4; + } + temSum = _mm_extract_epi32(sad_1, 2); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 6 * 4; + } + temSum = _mm_extract_epi32(sad_1, 3); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 7 * 4; + } + if (pBestSad64x64[0] != bestSad64x64) { + pBestSad64x64[0] = bestSad64x64; + xMv = _MVXT(mv) + (EB_S16) bestMV64x64; yMv = _MVYT(mv); + pBestMV64x64[0] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); + } + + // ****CODE PAST HERE IS BUGGY FOR GCC**** + + // XY + // X: 32x32 block [0..3] + // Y: Search position [0..7] + ss0 = _mm256_setr_m128i(sad_00, sad_01); // 07 06 05 04 03 02 01 00 + ss1 = _mm256_setr_m128i(sad_10, sad_11); // 17 16 15 14 13 12 11 10 + ss2 = _mm256_setr_m128i(sad_20, sad_21); // 27 26 25 24 23 22 21 20 + ss3 = _mm256_setr_m128i(sad_30, sad_31); // 37 36 35 34 33 32 31 30 + ss4 = _mm256_unpacklo_epi32(ss0, ss1); // 15 05 14 04 11 01 10 00 + ss5 = _mm256_unpacklo_epi32(ss2, ss3); // 35 25 34 24 31 21 30 20 + ss6 = _mm256_unpackhi_epi32(ss0, ss1); // 17 07 16 06 13 03 12 02 + ss7 = _mm256_unpackhi_epi32(ss2, ss3); // 37 27 36 26 33 23 32 22 + ss0 = _mm256_unpacklo_epi64(ss4, ss5); // 34 24 14 04 30 20 10 00 + ss1 = _mm256_unpackhi_epi64(ss4, ss5); // 35 25 15 05 31 21 11 01 + ss2 = _mm256_unpacklo_epi64(ss6, ss7); // 36 26 16 06 32 22 12 02 + ss3 = _mm256_unpackhi_epi64(ss6, ss7); // 37 27 17 07 33 23 13 03 + + // ss4 | ss5-2 | ss6 | + // a0 : a1 | a2 : a3 | min(a0, a1) : min(a2, a3) | | (ss4 & !ss6) | ((ss5-2) & ss6) | ((ss4 & !ss6) | ((ss5-2) & ss6)) | + // > (-1) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | + // > (-1) | > (-3) | <= (0) | a1 | -1 | 0 | -1 | + // > (-1) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | + // > (-1) | <= (-2) | <= (0) | a1 | -1 | 0 | -1 | + // <= (0) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | + // <= (0) | > (-3) | <= (0) | a0 | 0 | 0 | 0 | + // <= (0) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | + // <= (0) | <= (-2) | <= (0) | a0 | 0 | 0 | 0 | + + // *** 8 search points per position *** + + // ss0: Search Pos 0,4 for blocks 0,1,2,3 + // ss1: Search Pos 1,5 for blocks 0,1,2,3 + // ss2: Search Pos 2,6 for blocks 0,1,2,3 + // ss3: Search Pos 3,7 for blocks 0,1,2,3 + + ss4 = _mm256_cmpgt_epi32(ss0, ss1); + // not different SVT_LOG("%d\n", _mm_extract_epi32(_mm256_extracti128_si256(ss4, 0), 0)); // DEBUG + //ss4 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss1), _mm256_cmpeq_epi32(ss0, ss1)); + ss0 = _mm256_min_epi32(ss0, ss1); + ss5 = _mm256_cmpgt_epi32(ss2, ss3); + //ss5 = _mm256_or_si256(_mm256_cmpgt_epi32(ss2, ss3), _mm256_cmpeq_epi32(ss2, ss3)); + ss2 = _mm256_min_epi32(ss2, ss3); + ss5 = _mm256_sub_epi32(ss5, _mm256_set1_epi32(2)); // ss5-2 + + + // *** 4 search points per position *** + ss6 = _mm256_cmpgt_epi32(ss0, ss2); + //ss6 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss2), _mm256_cmpeq_epi32(ss0, ss2)); + ss0 = _mm256_min_epi32(ss0, ss2); + ss5 = _mm256_and_si256(ss5, ss6); // (ss5-2) & ss6 + ss4 = _mm256_andnot_si256(ss6, ss4); // ss4 & !ss6 + ss4 = _mm256_or_si256(ss4, ss5); // (ss4 & !ss6) | ((ss5-2) & ss6) + + // *** 2 search points per position *** + s0 = _mm_setzero_si128(); + s1 = _mm_setzero_si128(); + s2 = _mm_setzero_si128(); + s3 = _mm_setzero_si128(); + s4 = _mm_setzero_si128(); + s5 = _mm_setzero_si128(); + s6 = _mm_setzero_si128(); + s7 = _mm_setzero_si128(); + + // ss0 = 8 SADs, two search points for each 32x32 + // ss4 = 8 MVs, two search points for each 32x32 + // + // XY + // X: 32x32 block [0..3] + // Y: search position [0..1] + // Format: 00 10 20 30 01 11 21 31 + + // Each 128 bits contains 4 32x32 32bit block results #ifdef __GNUC__ - // SAD - s0 = _mm256_extracti128_si256(ss0, 1); - s1 = _mm256_extracti128_si256(ss0, 0); - // MV - s2 = _mm256_extracti128_si256(ss4, 1); - s3 = _mm256_extracti128_si256(ss4, 0); + // SAD + s0 = _mm256_extracti128_si256(ss0, 1); + s1 = _mm256_extracti128_si256(ss0, 0); + // MV + s2 = _mm256_extracti128_si256(ss4, 1); + s3 = _mm256_extracti128_si256(ss4, 0); #else - // SAD - s0 = _mm256_extracti128_si256(ss0, 0); - s1 = _mm256_extracti128_si256(ss0, 1); - // MV - s2 = _mm256_extracti128_si256(ss4, 0); - s3 = _mm256_extracti128_si256(ss4, 1); + // SAD + s0 = _mm256_extracti128_si256(ss0, 0); + s1 = _mm256_extracti128_si256(ss0, 1); + // MV + s2 = _mm256_extracti128_si256(ss4, 0); + s3 = _mm256_extracti128_si256(ss4, 1); #endif - //// Should be fine - //SVT_LOG("sad0 %d, %d, %d, %d\n", _mm_extract_epi32(s0, 0), _mm_extract_epi32(s0, 1), _mm_extract_epi32(s0, 2), _mm_extract_epi32(s0, 3)); // DEBUG - //SVT_LOG("sad1 %d, %d, %d, %d\n", _mm_extract_epi32(s1, 0), _mm_extract_epi32(s1, 1), _mm_extract_epi32(s1, 2), _mm_extract_epi32(s1, 3)); // DEBUG - //SVT_LOG("mv0 %d, %d, %d, %d\n", _mm_extract_epi32(s2, 0), _mm_extract_epi32(s2, 1), _mm_extract_epi32(s2, 2), _mm_extract_epi32(s2, 3)); // DEBUG - //SVT_LOG("mv1 %d, %d, %d, %d\n", _mm_extract_epi32(s3, 0), _mm_extract_epi32(s3, 1), _mm_extract_epi32(s3, 2), _mm_extract_epi32(s3, 3)); // DEBUG - - - // Choose the best MV out of the two, use s4 to hold results of min - s4 = _mm_cmpgt_epi32(s0, s1); - - // DIFFERENT BETWEEN VS AND GCC - // SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG - - //s4 = _mm_or_si128(_mm_cmpgt_epi32(s0, s1), _mm_cmpeq_epi32(s0, s1)); - s0 = _mm_min_epi32(s0, s1); - - - - // Extract MV's based on the blocks to s2 - s3 = _mm_sub_epi32(s3, _mm_set1_epi32(4)); // s3-4 - // Remove the MV's are not used from s2 - s2 = _mm_andnot_si128(s4, s2); - // Remove the MV's that are not used from s3 (inverse from s2 above operation) - s3 = _mm_and_si128(s4, s3); - // Combine the remaining candidates into s2 - s2 = _mm_or_si128(s2, s3); - // Convert MV's into encoders format - s2 = _mm_sub_epi32(_mm_setzero_si128(), s2); - s2 = _mm_slli_epi32(s2, 2); // mv info - - - // ***SAD*** - // s0: current SAD candidates for each 32x32 - // s1: best SAD's for 32x32 - - // << 1 to compensate for every other line - s0 = _mm_slli_epi32(s0, 1); // best sad info - // Load best SAD's - s1 = _mm_loadu_si128((__m128i*)pBestSad32x32); - - // Determine which candidates are better than the current best SAD's. - // s4 is used to determine the MV's of the new best SAD's - s4 = _mm_cmpgt_epi32(s1, s0); - // not different SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG - //s4 = _mm_or_si128(_mm_cmpgt_epi32(s1, s0), _mm_cmpeq_epi32(s1, s0)); - // Combine old and new min SAD's - s0 = _mm_min_epu32(s0, s1); - // Store new best SAD's back to memory - _mm_storeu_si128((__m128i*)pBestSad32x32, s0); - - - // ***Motion Vectors*** - // Load best MV's - // s3: candidate MV's - // s4: results of comparing SAD's - // s5: previous best MV's - - // Load previous best MV's - s5 = _mm_loadu_si128((__m128i*)pBestMV32x32); - // Remove the MV's that are being replaced - s5 = _mm_andnot_si128(s4, s5); - // Set s3 to the base MV - s3 = _mm_set1_epi32(mv); - // Add candidate MV's to base MV - s3 = _mm_add_epi16(s3, s2); - // Remove non-candidate's - s3 = _mm_and_si128(s3, s4); - // Combine remaining candidates with remaining best MVs - s3 = _mm_or_si128(s3, s5); - // Store back to memory - _mm_storeu_si128((__m128i*)pBestMV32x32, s3); + //// Should be fine + //SVT_LOG("sad0 %d, %d, %d, %d\n", _mm_extract_epi32(s0, 0), _mm_extract_epi32(s0, 1), _mm_extract_epi32(s0, 2), _mm_extract_epi32(s0, 3)); // DEBUG + //SVT_LOG("sad1 %d, %d, %d, %d\n", _mm_extract_epi32(s1, 0), _mm_extract_epi32(s1, 1), _mm_extract_epi32(s1, 2), _mm_extract_epi32(s1, 3)); // DEBUG + //SVT_LOG("mv0 %d, %d, %d, %d\n", _mm_extract_epi32(s2, 0), _mm_extract_epi32(s2, 1), _mm_extract_epi32(s2, 2), _mm_extract_epi32(s2, 3)); // DEBUG + //SVT_LOG("mv1 %d, %d, %d, %d\n", _mm_extract_epi32(s3, 0), _mm_extract_epi32(s3, 1), _mm_extract_epi32(s3, 2), _mm_extract_epi32(s3, 3)); // DEBUG + + + // Choose the best MV out of the two, use s4 to hold results of min + s4 = _mm_cmpgt_epi32(s0, s1); + + // DIFFERENT BETWEEN VS AND GCC + // SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG + + //s4 = _mm_or_si128(_mm_cmpgt_epi32(s0, s1), _mm_cmpeq_epi32(s0, s1)); + s0 = _mm_min_epi32(s0, s1); + + + + // Extract MV's based on the blocks to s2 + s3 = _mm_sub_epi32(s3, _mm_set1_epi32(4)); // s3-4 + // Remove the MV's are not used from s2 + s2 = _mm_andnot_si128(s4, s2); + // Remove the MV's that are not used from s3 (inverse from s2 above operation) + s3 = _mm_and_si128(s4, s3); + // Combine the remaining candidates into s2 + s2 = _mm_or_si128(s2, s3); + // Convert MV's into encoders format + s2 = _mm_sub_epi32(_mm_setzero_si128(), s2); + s2 = _mm_slli_epi32(s2, 2); // mv info + + + // ***SAD*** + // s0: current SAD candidates for each 32x32 + // s1: best SAD's for 32x32 + + // << 1 to compensate for every other line + s0 = _mm_slli_epi32(s0, 1); // best sad info + // Load best SAD's + s1 = _mm_loadu_si128((__m128i*)pBestSad32x32); + + // Determine which candidates are better than the current best SAD's. + // s4 is used to determine the MV's of the new best SAD's + s4 = _mm_cmpgt_epi32(s1, s0); + // not different SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG + //s4 = _mm_or_si128(_mm_cmpgt_epi32(s1, s0), _mm_cmpeq_epi32(s1, s0)); + // Combine old and new min SAD's + s0 = _mm_min_epu32(s0, s1); + // Store new best SAD's back to memory + _mm_storeu_si128((__m128i*)pBestSad32x32, s0); + + + // ***Motion Vectors*** + // Load best MV's + // s3: candidate MV's + // s4: results of comparing SAD's + // s5: previous best MV's + + // Load previous best MV's + s5 = _mm_loadu_si128((__m128i*)pBestMV32x32); + // Remove the MV's that are being replaced + s5 = _mm_andnot_si128(s4, s5); + // Set s3 to the base MV + s3 = _mm_set1_epi32(mv); + // Add candidate MV's to base MV + s3 = _mm_add_epi16(s3, s2); + // Remove non-candidate's + s3 = _mm_and_si128(s3, s4); + // Combine remaining candidates with remaining best MVs + s3 = _mm_or_si128(s3, s5); + // Store back to memory + _mm_storeu_si128((__m128i*)pBestMV32x32, s3); } AVX512_FUNC_TARGET void GetEightHorizontalSearchPointResultsAll85PUs_AVX512_INTRIN( - MeContext_t *contextPtr, - EB_U32 listIndex, - EB_U32 searchRegionIndex, - EB_U32 xSearchIndex, - EB_U32 ySearchIndex + MeContext_t *contextPtr, + EB_U32 listIndex, + EB_U32 searchRegionIndex, + EB_U32 xSearchIndex, + EB_U32 ySearchIndex ) { - EB_U8 *srcPtr = contextPtr->lcuSrcPtr; - EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); - EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; - - EB_U32 searchPositionTLIndex = searchRegionIndex; - - EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); - EB_U32 refNext16x16Offset = (reflumaStride << 4); - - EB_U32 currMVy = (((EB_U16)ySearchIndex) << 18); - EB_U16 currMVx = (((EB_U16)xSearchIndex << 2)); - EB_U32 currMV = currMVy | currMVx; - - EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; - EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; - EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; - EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; - - EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; - EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; - EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; - EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; - - EB_U16 *pSad16x16 = contextPtr->pEightPosSad16x16; - - /* - ---------------------- ---------------------- - | 16x16_0 | 16x16_1 | 16x16_4 | 16x16_5 | - ---------------------- ---------------------- - | 16x16_2 | 16x16_3 | 16x16_6 | 16x16_7 | - ----------------------- ----------------------- - | 16x16_8 | 16x16_9 | 16x16_12 | 16x16_13 | - ---------------------- ---------------------- - | 16x16_10 | 16x16_11 | 16x16_14 | 16x16_15 | - ----------------------- ----------------------- - */ - - const EB_U32 srcStride = contextPtr->lcuSrcStride; - const char c_blknum_tbl[16] = { 0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15 }; - - EB_U32 searchPositionIndex = searchPositionTLIndex; - EB_U32 blockIndex = 0; - - srcNext16x16Offset = srcStride << 4; - - for (int j = 0; j < 16; j += 4) - { - int i = j, blockIndex_l = blockIndex, searchPositionIndex_l = searchPositionIndex; - for ( ; i < (j+4); ++i, blockIndex_l += 16, searchPositionIndex_l += 16) - { - int blck = c_blknum_tbl[i]; - // for best performance this function is inlined - GetEightHorizontalSearchPointResults_8x8_16x16_PU_AVX512_INTRIN(srcPtr + blockIndex_l, srcStride, - refPtr + searchPositionIndex_l, reflumaStride, - &pBestSad8x8[4 * blck], - &pBestMV8x8[4 * blck], - &pBestSad16x16[blck], - &pBestMV16x16[blck], - currMV, - &pSad16x16[8 * blck]); - } - blockIndex += srcNext16x16Offset; - searchPositionIndex += refNext16x16Offset; - } - - ////32x32 and 64x64 - GetEightHorizontalSearchPointResults_32x32_64x64_PU_AVX2_INTRIN(pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); + EB_U8 *srcPtr = contextPtr->lcuSrcPtr; + EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); + EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; + + EB_U32 searchPositionTLIndex = searchRegionIndex; + + EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); + EB_U32 refNext16x16Offset = (reflumaStride << 4); + + EB_U32 currMVy = (((EB_U16)ySearchIndex) << 18); + EB_U16 currMVx = (((EB_U16)xSearchIndex << 2)); + EB_U32 currMV = currMVy | currMVx; + + EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; + EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; + EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; + EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; + + EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; + EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; + EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; + EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; + + EB_U16 *pSad16x16 = contextPtr->pEightPosSad16x16; + + /* + ---------------------- ---------------------- + | 16x16_0 | 16x16_1 | 16x16_4 | 16x16_5 | + ---------------------- ---------------------- + | 16x16_2 | 16x16_3 | 16x16_6 | 16x16_7 | + ----------------------- ----------------------- + | 16x16_8 | 16x16_9 | 16x16_12 | 16x16_13 | + ---------------------- ---------------------- + | 16x16_10 | 16x16_11 | 16x16_14 | 16x16_15 | + ----------------------- ----------------------- + */ + + const EB_U32 srcStride = contextPtr->lcuSrcStride; + const char c_blknum_tbl[16] = { 0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15 }; + + EB_U32 searchPositionIndex = searchPositionTLIndex; + EB_U32 blockIndex = 0; + + srcNext16x16Offset = srcStride << 4; + + for (int j = 0; j < 16; j += 4) + { + int i = j, blockIndex_l = blockIndex, searchPositionIndex_l = searchPositionIndex; + for ( ; i < (j+4); ++i, blockIndex_l += 16, searchPositionIndex_l += 16) + { + int blck = c_blknum_tbl[i]; + // for best performance this function is inlined + GetEightHorizontalSearchPointResults_8x8_16x16_PU_AVX512_INTRIN(srcPtr + blockIndex_l, srcStride, + refPtr + searchPositionIndex_l, reflumaStride, + &pBestSad8x8[4 * blck], + &pBestMV8x8[4 * blck], + &pBestSad16x16[blck], + &pBestMV16x16[blck], + currMV, + &pSad16x16[8 * blck]); + } + blockIndex += srcNext16x16Offset; + searchPositionIndex += refNext16x16Offset; + } + + ////32x32 and 64x64 + GetEightHorizontalSearchPointResults_32x32_64x64_PU_AVX2_INTRIN(pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); } #endif diff --git a/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h b/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h index 567e869ad..34b418480 100644 --- a/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h +++ b/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h @@ -56,6 +56,6 @@ extern void GetEightHorizontalSearchPointResultsAll85PUs_AVX512_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif // EbComputeSAD_AVX512_h diff --git a/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h b/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h index 1a9b4db74..a87c1505d 100644 --- a/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h @@ -12,27 +12,27 @@ extern "C" { #endif extern void IntraModePlanar_AVX2_INTRIN( - const EB_U32 size, //input parameter, denotes the size of the current PU - EB_U8 *refSamples, //input parameter, pointer to the reference samples - EB_U8 *predictionPtr, //output parameter, pointer to the prediction - const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); + const EB_U32 size, //input parameter, denotes the size of the current PU + EB_U8 *refSamples, //input parameter, pointer to the reference samples + EB_U8 *predictionPtr, //output parameter, pointer to the prediction + const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip); extern void IntraModeAngular_Vertical_Kernel_AVX2_INTRIN( - EB_U32 size, //input parameter, denotes the size of the current PU - EB_U8 *refSampMain, //input parameter, pointer to the reference samples - EB_U8 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 size, //input parameter, denotes the size of the current PU + EB_U8 *refSampMain, //input parameter, pointer to the reference samples + EB_U8 *predictionPtr, //output parameter, pointer to the prediction + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); extern void IntraModeAngular_Horizontal_Kernel_AVX2_INTRIN( - EB_U32 size, //input parameter, denotes the size of the current PU - EB_U8 *refSampMain, //input parameter, pointer to the reference samples - EB_U8 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 size, //input parameter, denotes the size of the current PU + EB_U8 *refSampMain, //input parameter, pointer to the reference samples + EB_U8 *predictionPtr, //output parameter, pointer to the prediction + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); extern void IntraModeVerticalLuma_AVX2_INTRIN( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -96,7 +96,7 @@ EB_U32 UpdateNeighborDcIntraPred_AVX2_INTRIN( EB_U16 originX, EB_U32 srcOriginX, EB_U32 srcOriginY, - EB_U32 blockSize); + EB_U32 blockSize); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c index 67477d0f4..7d86bd4cb 100644 --- a/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c @@ -1,4 +1,4 @@ -/* +/* * Copyright(c) 2018 Intel Corporation * SPDX - License - Identifier: BSD - 2 - Clause - Patent */ @@ -820,7 +820,7 @@ void IntraModeVerticalLuma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ) { EB_U32 topLeftOffset = size << 1; @@ -834,31 +834,31 @@ void IntraModeVerticalLuma_AVX2_INTRIN( xmm0 = _mm_setzero_si128(); xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); - xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); - + xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); + xmm_topLeft = _mm_set_epi16((signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, *(EB_U16*)(refSamples + topLeftOffset)); - xmm_topLeft = _mm_unpacklo_epi8(xmm_topLeft, xmm0); - xmm_topLeft = _mm_unpacklo_epi16(xmm_topLeft, xmm_topLeft); - xmm_topLeft = _mm_unpacklo_epi32(xmm_topLeft, xmm_topLeft); - xmm_topLeft_hi = _mm_unpackhi_epi64(xmm_topLeft, xmm_topLeft); - xmm_topLeft_lo = _mm_unpacklo_epi64(xmm_topLeft, xmm_topLeft); - + xmm_topLeft = _mm_unpacklo_epi8(xmm_topLeft, xmm0); + xmm_topLeft = _mm_unpacklo_epi16(xmm_topLeft, xmm_topLeft); + xmm_topLeft = _mm_unpacklo_epi32(xmm_topLeft, xmm_topLeft); + xmm_topLeft_hi = _mm_unpackhi_epi64(xmm_topLeft, xmm_topLeft); + xmm_topLeft_lo = _mm_unpacklo_epi64(xmm_topLeft, xmm_topLeft); + if (!skip) { if (size == 8) { - - xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); + + xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); + xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_top) - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_top) } - else if (size == 16) { - xmm_left = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); - xmm_left_lo = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); - xmm_left_hi = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); - xmm_left = _mm_packus_epi16(xmm_left_lo, xmm_left_hi); - xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); + else if (size == 16) { + xmm_left = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); + xmm_left_lo = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); + xmm_left_hi = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); + xmm_left = _mm_packus_epi16(xmm_left_lo, xmm_left_hi); + xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) @@ -869,31 +869,31 @@ void IntraModeVerticalLuma_AVX2_INTRIN( } else { xmm_left = _mm_packus_epi16(_mm_add_epi16( _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); + xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_4(xmm_left, xmm_mask2, xmm_top) - predictionPtr += (pStride << 1); + predictionPtr += (pStride << 1); MACRO_VERTICAL_LUMA_4(xmm_left, xmm_mask2, xmm_top) } } - else{ - pStride <<= 1; + else{ + pStride <<= 1; xmm_mask_skip = _mm_set1_epi16(0x00FF); if (size == 8) { xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); + xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_top); } else if (size == 16) { xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); + xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) } else { - xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_mask1); + xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); + xmm_top = _mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_4(xmm_left, xmm_mask2, xmm_top) } } @@ -909,20 +909,20 @@ void IntraModeVerticalLuma_AVX2_INTRIN( pStride = pStride << (skip ? 1 : 0); xmm0 = _mm256_loadu_si256((__m256i *)(refSamples + topOffset)); - - for (count = 0; count < size_to_write; count ++) { - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); + + for (count = 0; count < size_to_write; count ++) { + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); } } @@ -934,7 +934,7 @@ void IntraModeDCLuma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { __m128i xmm0 = _mm_setzero_si128(); EB_U32 pStride = predictionBufferStride; @@ -943,7 +943,7 @@ void IntraModeDCLuma_AVX2_INTRIN( if (size != 32) { - __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); + __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); __m128i xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); __m128i xmm_C2 = _mm_set1_epi16(0x0002); @@ -958,9 +958,9 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); xmm_left_hi = _mm_unpackhi_epi8(xmm_left, xmm0); - - xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); - + + xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); + xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sum, 8), xmm_sum), _mm_cvtsi32_si128(16)), 5); xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); @@ -970,12 +970,12 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); - xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)); - xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), 1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), _mm_and_si128(xmm_top, xmm_mask1)); @@ -1011,22 +1011,22 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - + xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); - xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); _mm_storel_epi64((__m128i *)(predictionPtr), xmm_predictionPtr_0); - + _mm_storel_epi64((__m128i *)(predictionPtr+pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); @@ -1036,14 +1036,14 @@ void IntraModeDCLuma_AVX2_INTRIN( predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_predictionDcValue) - + } else { __m128i xmm_left, xmm_top, xmm_top_lo, xmm_left_lo, xmm_predictionDcValue, xmm_predictionDcValue_16; __m128i xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3, xmm_predictionPtr_0; xmm_top = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)); xmm_left = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)); - + xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)), _mm_cvtsi32_si128(4)), 3); @@ -1056,15 +1056,15 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - + xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); - + xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); *(EB_U32*)predictionPtr = _mm_cvtsi128_si32(xmm_predictionPtr_0); - + *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); @@ -1085,7 +1085,7 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); - + xmm_left_skipped = _mm_and_si128(xmm_skip_mask, xmm_left); xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); @@ -1095,22 +1095,22 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_skipped, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_skipped, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); - - xmm_top = _mm_and_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + + xmm_top = _mm_and_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), xmm_mask1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_skipped), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); - _mm_storeu_si128((__m128i *)predictionPtr, xmm_predictionPtr_0); - + _mm_storeu_si128((__m128i *)predictionPtr, xmm_predictionPtr_0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); @@ -1135,10 +1135,10 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); @@ -1149,10 +1149,10 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(xmm_predictionPtr_0, xmm_mask2), _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1)); _mm_storel_epi64((__m128i *)predictionPtr, xmm_predictionPtr_0); - + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); - + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_or_si128(_mm_and_si128(_mm_srli_si128(xmm_left, 1), xmm_mask2), xmm_predictionDcValue)); @@ -1160,29 +1160,29 @@ void IntraModeDCLuma_AVX2_INTRIN( } } } - - + + /*************************************************************************************************************************************************************************************************************/ else { - __m256i xmm_sum,xmm_sadleft,xmm_sadtop,xmm_toptmp,xmm_lefttmp ,xmm_set,xmm_sum128_2,xmm_sum256,xmm_predictionDcValue; - __m256i xmm1 = _mm256_setzero_si256(); + __m256i xmm_sum,xmm_sadleft,xmm_sadtop,xmm_toptmp,xmm_lefttmp ,xmm_set,xmm_sum128_2,xmm_sum256,xmm_predictionDcValue; + __m256i xmm1 = _mm256_setzero_si256(); __m128i xmm_sumhi,xmm_sumlo,xmm_sum1,xmm_sum128,xmm_sumhitmp,xmm_sumlotmp,xmm_movelotmp,xmm_movehitmp; - + xmm_sumhi = xmm_sumlo = xmm_sum128 = xmm_sumhitmp = xmm_sumlotmp = _mm_setzero_si128(); xmm_sum = xmm_sadleft = xmm_sadtop = xmm_toptmp = xmm_lefttmp = _mm256_setzero_si256(); - + xmm_toptmp =_mm256_sad_epu8( _mm256_set_m128i ( _mm_loadu_si128( (__m128i *)(refSamples + topOffset +16) ),_mm_loadu_si128((__m128i *)(refSamples + topOffset))),xmm1); xmm_lefttmp =_mm256_sad_epu8( _mm256_set_m128i( _mm_loadu_si128((__m128i *)(refSamples + leftOffset+16)),_mm_loadu_si128((__m128i *)(refSamples + leftOffset))),xmm1); - - xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp ) ; - xmm_sum = _mm256_hadd_epi32 (xmm_sum,xmm_sum); - xmm_sumlo = _mm256_extracti128_si256(xmm_sum,0); - xmm_sumhi = _mm256_extracti128_si256(xmm_sum,1); - - xmm_movelotmp = _mm_move_epi64 (xmm_sumlo); + + xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp ) ; + xmm_sum = _mm256_hadd_epi32 (xmm_sum,xmm_sum); + xmm_sumlo = _mm256_extracti128_si256(xmm_sum,0); + xmm_sumhi = _mm256_extracti128_si256(xmm_sum,1); + + xmm_movelotmp = _mm_move_epi64 (xmm_sumlo); xmm_movehitmp = _mm_move_epi64 (xmm_sumhi); - + xmm_sum1 = _mm_add_epi32(xmm_movelotmp,xmm_movehitmp); xmm_sum1 = _mm_hadd_epi32(xmm_sum1,xmm_sum1); @@ -1190,15 +1190,15 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_sum256 = _mm256_castsi128_si256(xmm_sum1); -//#endif +//#endif xmm_set = _mm256_castsi128_si256(_mm_set1_epi32(32)); - - xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset + + xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2,6); //_mm256_srli_epi32 - - __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); - + + __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); + EB_U8 dc = _mm_cvtsi128_si32 (dc128); xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 @@ -1207,35 +1207,35 @@ void IntraModeDCLuma_AVX2_INTRIN( for (count = 0; count < 2; ++count) { - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); - + predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); - + predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); - + predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - + } @@ -1251,7 +1251,7 @@ void IntraModeAngular_2_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; @@ -1259,13 +1259,13 @@ void IntraModeAngular_2_AVX2_INTRIN( if (!skip) { if (size == 32) { - EB_U32 count; + EB_U32 count; for (count = 0; count < 8; ++count){ _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 1))); _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 2))); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 3))); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 4))); - + refSamples += 4; predictionPtr += (pStride << 2); } @@ -1317,7 +1317,7 @@ void IntraModeAngular_2_AVX2_INTRIN( EB_U32 count; for (count = 0; count < 4; ++count) { - + _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 1))); _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 3))); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 5))); @@ -1327,7 +1327,7 @@ void IntraModeAngular_2_AVX2_INTRIN( } } else if (size == 16) { - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); @@ -1342,7 +1342,7 @@ void IntraModeAngular_2_AVX2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 1))); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 3))); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 5))); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 7))); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 7))); } } else { @@ -1355,287 +1355,287 @@ void IntraModeAngular_2_AVX2_INTRIN( #define MIDRANGE_VALUE_8BIT 128 EB_U32 UpdateNeighborDcIntraPred_AVX2_INTRIN( - EB_U8 *yIntraReferenceArrayReverse, + EB_U8 *yIntraReferenceArrayReverse, EB_U16 inputHeight, EB_U16 strideY, EB_BYTE bufferY, EB_U16 originY, EB_U16 originX, - EB_U32 srcOriginX, - EB_U32 srcOriginY, - EB_U32 blockSize) + EB_U32 srcOriginX, + EB_U32 srcOriginY, + EB_U32 blockSize) { - EB_U32 idx; - EB_U8 *srcPtr; - EB_U8 *dstPtr; - EB_U8 *readPtr; + EB_U32 idx; + EB_U8 *srcPtr; + EB_U8 *dstPtr; + EB_U8 *readPtr; - //EB_U32 count; + //EB_U32 count; (void) inputHeight; - EB_U8 *yBorderReverse = yIntraReferenceArrayReverse; - //EB_U32 height = inputHeight; - //EB_U32 blockSizeHalf = blockSize << 1; - EB_U32 topOffset = (blockSize << 1) + 1; - EB_U32 leftOffset = 0; - EB_U32 stride = strideY; - __m128i xmm0 = _mm_setzero_si128(); - __m256i xmm1 = _mm256_setzero_si256(); - __m256i ymm0; + EB_U8 *yBorderReverse = yIntraReferenceArrayReverse; + //EB_U32 height = inputHeight; + //EB_U32 blockSizeHalf = blockSize << 1; + EB_U32 topOffset = (blockSize << 1) + 1; + EB_U32 leftOffset = 0; + EB_U32 stride = strideY; + __m128i xmm0 = _mm_setzero_si128(); + __m256i xmm1 = _mm256_setzero_si256(); + __m256i ymm0; - __m128i xmm_sad = _mm_setzero_si128(); + __m128i xmm_sad = _mm_setzero_si128(); - // Adjust the Source ptr to start at the origin of the block being updated - srcPtr = bufferY + (((srcOriginY + originY) * stride) + (srcOriginX + originX)); + // Adjust the Source ptr to start at the origin of the block being updated + srcPtr = bufferY + (((srcOriginY + originY) * stride) + (srcOriginX + originX)); - // Adjust the Destination ptr to start at the origin of the Intra reference array - dstPtr = yBorderReverse; + // Adjust the Destination ptr to start at the origin of the Intra reference array + dstPtr = yBorderReverse; //CHKn here we need ref on Top+Left only. and memset is done only for border CUs - //Initialise the Luma Intra Reference Array to the mid range value 128 (for CUs at the picture boundaries) - memset(dstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); + //Initialise the Luma Intra Reference Array to the mid range value 128 (for CUs at the picture boundaries) + memset(dstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); - // Get the left-column - //count = blockSizeHalf; + // Get the left-column + //count = blockSizeHalf; - readPtr = srcPtr - 1; + readPtr = srcPtr - 1; - if (blockSize != 32) { + if (blockSize != 32) { - __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); - __m128i xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); - __m128i xmm_C2 = _mm_set1_epi16(0x0002); + __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); + __m128i xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); + __m128i xmm_C2 = _mm_set1_epi16(0x0002); - if (blockSize == 16) { - __m128i xmm_predictionDcValue, xmm_top, xmm_left, xmm_sum, xmm_predictionPtr_0; - __m128i xmm_top_lo, xmm_top_hi, xmm_left_lo, xmm_left_hi, xmm_predictionDcValue_16, xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3; - if (srcOriginY != 0) - { - xmm_top = _mm_loadu_si128((__m128i *)(srcPtr - stride)); - } - else - { - xmm_top = _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128); - } + if (blockSize == 16) { + __m128i xmm_predictionDcValue, xmm_top, xmm_left, xmm_sum, xmm_predictionPtr_0; + __m128i xmm_top_lo, xmm_top_hi, xmm_left_lo, xmm_left_hi, xmm_predictionDcValue_16, xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3; + if (srcOriginY != 0) + { + xmm_top = _mm_loadu_si128((__m128i *)(srcPtr - stride)); + } + else + { + xmm_top = _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128); + } - if (srcOriginX != 0) { - xmm_left = _mm_set_epi8(*(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); - } - else - { - xmm_left = _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); - } + if (srcOriginX != 0) { + xmm_left = _mm_set_epi8(*(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); + } + else + { + xmm_left = _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); + } - xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); - xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); - xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); - xmm_left_hi = _mm_unpackhi_epi8(xmm_left, xmm0); + xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); + xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); + xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); + xmm_left_hi = _mm_unpackhi_epi8(xmm_left, xmm0); - xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); + xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); - xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sum, 8), xmm_sum), _mm_cvtsi32_si128(16)), 5); - xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sum, 8), xmm_sum), _mm_cvtsi32_si128(16)), 5); + xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); - xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); - xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); + xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), - _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)); + xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)); - xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), - _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), 1); + xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), 1); - xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), _mm_and_si128(xmm_top, xmm_mask1)); + xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), _mm_and_si128(xmm_top, xmm_mask1)); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - for (idx = 4; idx < blockSize; idx += 4){ - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + for (idx = 4; idx < blockSize; idx += 4){ + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - } + } - xmm_sad = _mm_add_epi32(xmm_sad, _mm_srli_si128(xmm_sad, 8)); - return _mm_cvtsi128_si32(xmm_sad); - } + xmm_sad = _mm_add_epi32(xmm_sad, _mm_srli_si128(xmm_sad, 8)); + return _mm_cvtsi128_si32(xmm_sad); + } else { - __m128i xmm_left, xmm_top, xmm_top_lo, xmm_left_lo, xmm_predictionDcValue, xmm_predictionDcValue_16; - __m128i xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3, xmm_predictionPtr_0; - if (srcOriginY != 0) - { - xmm_top = _mm_loadl_epi64((__m128i *)(srcPtr - stride)); - } - else - { - xmm_top = _mm_loadl_epi64((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128);// - } + __m128i xmm_left, xmm_top, xmm_top_lo, xmm_left_lo, xmm_predictionDcValue, xmm_predictionDcValue_16; + __m128i xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3, xmm_predictionPtr_0; + if (srcOriginY != 0) + { + xmm_top = _mm_loadl_epi64((__m128i *)(srcPtr - stride)); + } + else + { + xmm_top = _mm_loadl_epi64((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128);// + } - if (srcOriginX != 0) { - xmm_left = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); - } - else - { - xmm_left = _mm_loadl_epi64((__m128i *)(yBorderReverse + leftOffset)); - } + if (srcOriginX != 0) { + xmm_left = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); + } + else + { + xmm_left = _mm_loadl_epi64((__m128i *)(yBorderReverse + leftOffset)); + } - xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); - xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); + xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); + xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); - xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)), _mm_cvtsi32_si128(8)), 4); - xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)), _mm_cvtsi32_si128(8)), 4); + xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); - xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); + xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); - xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); - xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); - xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); - xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); + xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); + xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); - xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); + xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); - xmm_sad = _mm_setzero_si128(); + xmm_sad = _mm_setzero_si128(); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - for (idx = 4; idx < blockSize; idx += 4){ - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + for (idx = 4; idx < blockSize; idx += 4){ + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - } + } - return _mm_cvtsi128_si32(xmm_sad); + return _mm_cvtsi128_si32(xmm_sad); - } - } + } + } - /*************************************************************************************************************************************************************************************************************/ - else { - __m256i xmm_sum, xmm_sadleft, xmm_sadtop, xmm_toptmp, xmm_lefttmp, xmm_set, xmm_sum128_2, xmm_sum256, xmm_predictionDcValue; - __m128i xmm_sumhi, xmm_sumlo, xmm_sum1, xmm_sum128, xmm_sumhitmp, xmm_sumlotmp, xmm_movelotmp, xmm_movehitmp; + /*************************************************************************************************************************************************************************************************************/ + else { + __m256i xmm_sum, xmm_sadleft, xmm_sadtop, xmm_toptmp, xmm_lefttmp, xmm_set, xmm_sum128_2, xmm_sum256, xmm_predictionDcValue; + __m128i xmm_sumhi, xmm_sumlo, xmm_sum1, xmm_sum128, xmm_sumhitmp, xmm_sumlotmp, xmm_movelotmp, xmm_movehitmp; - xmm_sumhi = xmm_sumlo = xmm_sum128 = xmm_sumhitmp = xmm_sumlotmp = _mm_setzero_si128(); - xmm_sum = xmm_sadleft = xmm_sadtop = xmm_toptmp = xmm_lefttmp = _mm256_setzero_si256(); + xmm_sumhi = xmm_sumlo = xmm_sum128 = xmm_sumhitmp = xmm_sumlotmp = _mm_setzero_si128(); + xmm_sum = xmm_sadleft = xmm_sadtop = xmm_toptmp = xmm_lefttmp = _mm256_setzero_si256(); - if (srcOriginY != 0) - { - xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(srcPtr - stride + 16)), _mm_loadu_si128((__m128i *)(srcPtr - stride))), xmm1); + if (srcOriginY != 0) + { + xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(srcPtr - stride + 16)), _mm_loadu_si128((__m128i *)(srcPtr - stride))), xmm1); - } - else - { - xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + topOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset))), xmm1); + } + else + { + xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + topOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset))), xmm1); - } - if (srcOriginX != 0) { - xmm_lefttmp = _mm256_sad_epu8(_mm256_set_epi8(*(readPtr + 31 * stride), *(readPtr + 30 * stride), *(readPtr + 29 * stride), *(readPtr + 28 * stride), *(readPtr + 27 * stride), *(readPtr + 26 * stride), *(readPtr + 25 * stride), *(readPtr + 24 * stride), *(readPtr + 23 * stride), *(readPtr + 22 * stride), *(readPtr + 21 * stride), *(readPtr + 20 * stride), - *(readPtr + 19 * stride), *(readPtr + 18 * stride), *(readPtr + 17 * stride), *(readPtr + 16 * stride), *(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr) - , xmm1); + } + if (srcOriginX != 0) { + xmm_lefttmp = _mm256_sad_epu8(_mm256_set_epi8(*(readPtr + 31 * stride), *(readPtr + 30 * stride), *(readPtr + 29 * stride), *(readPtr + 28 * stride), *(readPtr + 27 * stride), *(readPtr + 26 * stride), *(readPtr + 25 * stride), *(readPtr + 24 * stride), *(readPtr + 23 * stride), *(readPtr + 22 * stride), *(readPtr + 21 * stride), *(readPtr + 20 * stride), + *(readPtr + 19 * stride), *(readPtr + 18 * stride), *(readPtr + 17 * stride), *(readPtr + 16 * stride), *(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr) + , xmm1); - } - else - { - xmm_lefttmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset))), xmm1); + } + else + { + xmm_lefttmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset))), xmm1); - } + } - xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp); - xmm_sum = _mm256_hadd_epi32(xmm_sum, xmm_sum); + xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp); + xmm_sum = _mm256_hadd_epi32(xmm_sum, xmm_sum); - xmm_sumlo = _mm256_extracti128_si256(xmm_sum, 0); - xmm_sumhi = _mm256_extracti128_si256(xmm_sum, 1); + xmm_sumlo = _mm256_extracti128_si256(xmm_sum, 0); + xmm_sumhi = _mm256_extracti128_si256(xmm_sum, 1); - xmm_movelotmp = _mm_move_epi64(xmm_sumlo); - xmm_movehitmp = _mm_move_epi64(xmm_sumhi); + xmm_movelotmp = _mm_move_epi64(xmm_sumlo); + xmm_movehitmp = _mm_move_epi64(xmm_sumhi); - xmm_sum1 = _mm_add_epi32(xmm_movelotmp, xmm_movehitmp); + xmm_sum1 = _mm_add_epi32(xmm_movelotmp, xmm_movehitmp); - xmm_sum1 = _mm_hadd_epi32(xmm_sum1, xmm_sum1); + xmm_sum1 = _mm_hadd_epi32(xmm_sum1, xmm_sum1); - xmm_sum256 = _mm256_castsi128_si256(xmm_sum1); + xmm_sum256 = _mm256_castsi128_si256(xmm_sum1); - xmm_set = _mm256_castsi128_si256(_mm_set1_epi32(32)); + xmm_set = _mm256_castsi128_si256(_mm_set1_epi32(32)); - xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset - xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2, 6); //_mm256_srli_epi32 + xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset + xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2, 6); //_mm256_srli_epi32 - __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); + __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); - EB_U8 dc = _mm_cvtsi128_si32(dc128); - xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 + EB_U8 dc = _mm_cvtsi128_si32(dc128); + xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 - // SAD - ymm0 = _mm256_setzero_si256(); - for (idx = 0; idx < blockSize; idx += 2) { - ymm0 = _mm256_add_epi32(ymm0, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)srcPtr), xmm_predictionDcValue)); - xmm1 = _mm256_add_epi32(xmm1, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)(srcPtr + stride)), xmm_predictionDcValue)); - srcPtr += stride << 1; - } - ymm0 = _mm256_add_epi32(ymm0, xmm1); - xmm0 = _mm_add_epi32(_mm256_extracti128_si256(ymm0, 0), _mm256_extracti128_si256(ymm0, 1)); - xmm0 = _mm_add_epi32(xmm0, _mm_srli_si128(xmm0, 8)); - return (EB_U32)_mm_cvtsi128_si32(xmm0); + // SAD + ymm0 = _mm256_setzero_si256(); + for (idx = 0; idx < blockSize; idx += 2) { + ymm0 = _mm256_add_epi32(ymm0, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)srcPtr), xmm_predictionDcValue)); + xmm1 = _mm256_add_epi32(xmm1, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)(srcPtr + stride)), xmm_predictionDcValue)); + srcPtr += stride << 1; + } + ymm0 = _mm256_add_epi32(ymm0, xmm1); + xmm0 = _mm_add_epi32(_mm256_extracti128_si256(ymm0, 0), _mm256_extracti128_si256(ymm0, 1)); + xmm0 = _mm_add_epi32(xmm0, _mm_srli_si128(xmm0, 8)); + return (EB_U32)_mm_cvtsi128_si32(xmm0); - } + } } /*********************************************************************************************************************************************************************************************** @@ -1646,7 +1646,7 @@ void IntraModeAngular_18_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 topLeftOffset = (size << 1); @@ -1655,7 +1655,7 @@ void IntraModeAngular_18_AVX2_INTRIN( if (size == 32) { - EB_U32 count; + EB_U32 count; for (count = 0; count < 8; ++count){ _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset))); @@ -1714,10 +1714,10 @@ void IntraModeAngular_18_AVX2_INTRIN( EB_U32 count; for (count = 0; count < 4; ++count) { - + _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset ))); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 2))); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 4))); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 2))); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 4))); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 6))); refSamples -= 8; @@ -1739,7 +1739,7 @@ void IntraModeAngular_18_AVX2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset ))); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 2))); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 4))); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 6))); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 6))); } } else { @@ -1758,7 +1758,7 @@ void IntraModeAngular_34_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = ((size << 1) + 1); @@ -1766,13 +1766,13 @@ void IntraModeAngular_34_AVX2_INTRIN( if (!skip) { if (size == 32) { - - EB_U32 count; + + EB_U32 count; for (count = 0; count < 8; ++count){ - - _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 1))); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 2))); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 3))); + + _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 1))); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 2))); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 3))); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 4))); refSamples += 4; @@ -1851,7 +1851,7 @@ void IntraModeAngular_34_AVX2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 1))); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 3))); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 5))); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 7))); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 7))); } } else { @@ -1866,12 +1866,12 @@ void IntraModeVerticalChroma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = (size << 1) + 1; - // Jing: + // Jing: // TODO: add size == 32 for 444 if (!skip) { if (size == 32) { @@ -1887,55 +1887,55 @@ void IntraModeVerticalChroma_AVX2_INTRIN( xmm0 = _mm256_loadu_si256((__m256i *)(refSamples + topOffset)); for (count = 0; count < size_to_write; count ++) { - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); } } else if (size == 16) { - __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else if (size == 8) { - __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); - _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storel_epi64((__m128i *)predictionPtr, xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); + __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); + _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storel_epi64((__m128i *)predictionPtr, xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else { - EB_U32 top = *(EB_U32*)(refSamples + topOffset); + EB_U32 top = *(EB_U32*)(refSamples + topOffset); *(EB_U32*)(predictionPtr) = top; *(EB_U32*)(predictionPtr + pStride) = top; *(EB_U32*)(predictionPtr + 2 * pStride) = top; @@ -1958,28 +1958,28 @@ void IntraModeVerticalChroma_AVX2_INTRIN( } } } else if (size == 16) { - - __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + + __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else if (size == 8) { - - __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); - _mm_storel_epi64((__m128i *)predictionPtr, xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); + + __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); + _mm_storel_epi64((__m128i *)predictionPtr, xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else { - EB_U32 top = *(EB_U32*)(refSamples + topOffset); + EB_U32 top = *(EB_U32*)(refSamples + topOffset); *(EB_U32*)(predictionPtr) = top; *(EB_U32*)(predictionPtr + pStride) = top; } @@ -1991,13 +1991,13 @@ void IntraModeDCChroma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { __m128i xmm0 = _mm_setzero_si128(); EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = (size << 1) + 1; EB_U32 leftOffset = 0; - + //Jing: //TODO: add size == 32 for 444 if (!skip) { @@ -2032,7 +2032,7 @@ void IntraModeDCChroma_AVX2_INTRIN( xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2,6); //_mm256_srli_epi32 - __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); + __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); EB_U8 dc = _mm_cvtsi128_si32 (dc128); xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 @@ -2042,28 +2042,28 @@ void IntraModeDCChroma_AVX2_INTRIN( for (count = 0; count < 2; ++count) { - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); @@ -2072,7 +2072,7 @@ void IntraModeDCChroma_AVX2_INTRIN( } } else if (size == 16) { __m128i sum, predictionDcValue; - + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm0)); @@ -2105,10 +2105,10 @@ void IntraModeDCChroma_AVX2_INTRIN( } else if (size == 8) { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0)); - + predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(8)), 4); predictionDcValue = _mm_unpacklo_epi8(predictionDcValue, predictionDcValue); predictionDcValue = _mm_unpacklo_epi16(predictionDcValue, predictionDcValue); @@ -2126,10 +2126,10 @@ void IntraModeDCChroma_AVX2_INTRIN( } else { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm0)); - + predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(4)), 3); predictionDcValue = _mm_unpacklo_epi8(predictionDcValue, predictionDcValue); predictionDcValue = _mm_unpacklo_epi16(predictionDcValue, predictionDcValue); @@ -2177,8 +2177,8 @@ void IntraModeDCChroma_AVX2_INTRIN( } else if (size == 16) { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm0)); predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(sum, 8), sum), _mm_cvtsi32_si128(16)), 5); @@ -2199,10 +2199,10 @@ void IntraModeDCChroma_AVX2_INTRIN( } else if (size == 8) { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0)); - + predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(8)), 4); predictionDcValue = _mm_unpacklo_epi8(predictionDcValue, predictionDcValue); predictionDcValue = _mm_unpacklo_epi16(predictionDcValue, predictionDcValue); @@ -2215,8 +2215,8 @@ void IntraModeDCChroma_AVX2_INTRIN( } else { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm0)); predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(4)), 3); diff --git a/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c index 0017013d6..fad86e383 100644 --- a/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c @@ -40,7 +40,7 @@ void ChromaInterpolationFilterTwoD16bit_AVX2_INTRIN( ChromaInterpolationFilterOneDOutRaw16bitHorizontal_AVX2_INTRIN(refPic - ((MaxChromaFilterTag - 1) >> 1)*srcStride, srcStride, firstPassIFDst, puWidth, puHeight + MaxChromaFilterTag - 1, (EB_S16 *)EB_NULL, fracPosx, 0); #endif - + //vertical filtering ChromaInterpolationFilterTwoDInRaw16bit_SSE2_INTRIN(firstPassIFDst, dst, dstStride, puWidth, puHeight, fracPosy); } @@ -62,209 +62,209 @@ void ChromaInterpolationFilterTwoDOutRaw16bit_AVX2_INTRIN( //on-the-fly scheme ChromaInterpolationFilterOneDOutRaw16bitHorizontal_AVX2_INTRIN(refPic - ((MaxChromaFilterTag - 1) >> 1)*srcStride, srcStride, firstPassIFDst, puWidth, puHeight + MaxChromaFilterTag - 1, (EB_S16 *)EB_NULL, fracPosx, 0); #endif - + //vertical filtering ChromaInterpolationFilterTwoDInRawOutRaw_SSE2_INTRIN(firstPassIFDst, dst, puWidth, puHeight, fracPosy); } void ChromaInterpolationFilterOneDOutRaw16bitHorizontal_AVX2_INTRIN( - EB_U16 *refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_U16 *refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; - - __m256i e0, e1, e2, e3; - EB_U32 remain = 0, height = 0; - EB_S16 *dst2, *dst_cpy; - - (void)firstPassIFDst; - (void)fracPosy; - - refPic--; - //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); - - c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeffSR1_AVX[fracPosx]); - c0 = _mm_unpacklo_epi16(c0, c0); - c3 = _mm_shuffle_epi32(c0, 0xff); - c2 = _mm_shuffle_epi32(c0, 0xaa); - c1 = _mm_shuffle_epi32(c0, 0x55); - c0 = _mm_shuffle_epi32(c0, 0x00); - - if (puWidth & 2) { - ptr = refPic; - for (rowCount = 0; rowCount> 1); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); - sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); - sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, sum); - dst += 8; - } - - puWidth -= 2; - if (!puWidth) { - return; - } - refPic += 2; - } - - if (puWidth & 4) { - ptr = refPic; - for (rowCount = 0; rowCount> 1); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(b0, c0)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(b1, c1)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(b3, c3)); - sum = _mm_adds_epi16(sum, _mm_mullo_epi16(b2, c2)); - sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, sum); - dst += 8; - } - - puWidth -= 4; - if (puWidth == 0) { - return; - } - refPic += 4; - } - - e0 = _mm256_insertf128_si256(_mm256_castsi128_si256(c0), c0, 1); - e1 = _mm256_insertf128_si256(_mm256_castsi128_si256(c1), c1, 1); - e2 = _mm256_insertf128_si256(_mm256_castsi128_si256(c2), c2, 1); - e3 = _mm256_insertf128_si256(_mm256_castsi128_si256(c3), c3, 1); - - if (puWidth >= 16 && !(puWidth & 15)) { - dst_cpy = dst; - - for (colCount = 0; colCount> 1); - ptr += srcStride; - - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); - sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); - sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, _mm256_castsi256_si128(sum1)); - _mm_storeu_si128((__m128i *)dst2, _mm256_extracti128_si256(sum1, 1)); // suboptimal code-gen of a cross-lane shuffle by MSVC, no way to fix - dst += 8; - dst2 += 8; - } - refPic += 16; - } - } - else { - remain = puHeight & 1; - height = puHeight - remain; - - for (colCount = 0; colCount < puWidth; colCount += 8) { - ptr = refPic; - for (rowCount = 0; rowCount < height; rowCount += 2) { - __m256i d0 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)ptr)); - __m256i d1 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 1))); - __m256i d2 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 2))); - __m256i d3 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 3))); - __m256i sum1 = _mm256_set1_epi16(OFFSET2D1_10BIT >> 1); - ptr += srcStride; - - { // fixing MSVC code-gen of reg-mem VINSERT instructions - EB_U16 *ptr_ = ptr; - ptr += srcStride; - d0 = _mm256_inserti128_si256(d0, _mm_loadu_si128((__m128i *)ptr_), 1); - d1 = _mm256_inserti128_si256(d1, _mm_loadu_si128((__m128i *)(ptr_ + 1)), 1); - d2 = _mm256_inserti128_si256(d2, _mm_loadu_si128((__m128i *)(ptr_ + 2)), 1); - d3 = _mm256_inserti128_si256(d3, _mm_loadu_si128((__m128i *)(ptr_ + 3)), 1); - } - - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); - sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); - sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); - - _mm256_storeu_si256((__m256i *)dst, sum1); - dst += 16; - } - - for (rowCount = 0; rowCount < remain; rowCount++) { - a0 = _mm_loadu_si128((__m128i *)ptr); - a1 = _mm_loadu_si128((__m128i *)(ptr + 1)); - a2 = _mm_loadu_si128((__m128i *)(ptr + 2)); - a3 = _mm_loadu_si128((__m128i *)(ptr + 3)); - ptr += srcStride; - - sum = _mm_set1_epi16(OFFSET2D1_10BIT >> 1); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); - sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); - sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, sum); - dst += 8; - } - refPic += 8; - } - } + EB_U32 rowCount, colCount; + EB_U16 *ptr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; + + __m256i e0, e1, e2, e3; + EB_U32 remain = 0, height = 0; + EB_S16 *dst2, *dst_cpy; + + (void)firstPassIFDst; + (void)fracPosy; + + refPic--; + //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); + + c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeffSR1_AVX[fracPosx]); + c0 = _mm_unpacklo_epi16(c0, c0); + c3 = _mm_shuffle_epi32(c0, 0xff); + c2 = _mm_shuffle_epi32(c0, 0xaa); + c1 = _mm_shuffle_epi32(c0, 0x55); + c0 = _mm_shuffle_epi32(c0, 0x00); + + if (puWidth & 2) { + ptr = refPic; + for (rowCount = 0; rowCount> 1); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); + sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); + sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, sum); + dst += 8; + } + + puWidth -= 2; + if (!puWidth) { + return; + } + refPic += 2; + } + + if (puWidth & 4) { + ptr = refPic; + for (rowCount = 0; rowCount> 1); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(b0, c0)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(b1, c1)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(b3, c3)); + sum = _mm_adds_epi16(sum, _mm_mullo_epi16(b2, c2)); + sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, sum); + dst += 8; + } + + puWidth -= 4; + if (puWidth == 0) { + return; + } + refPic += 4; + } + + e0 = _mm256_insertf128_si256(_mm256_castsi128_si256(c0), c0, 1); + e1 = _mm256_insertf128_si256(_mm256_castsi128_si256(c1), c1, 1); + e2 = _mm256_insertf128_si256(_mm256_castsi128_si256(c2), c2, 1); + e3 = _mm256_insertf128_si256(_mm256_castsi128_si256(c3), c3, 1); + + if (puWidth >= 16 && !(puWidth & 15)) { + dst_cpy = dst; + + for (colCount = 0; colCount> 1); + ptr += srcStride; + + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); + sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); + sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, _mm256_castsi256_si128(sum1)); + _mm_storeu_si128((__m128i *)dst2, _mm256_extracti128_si256(sum1, 1)); // suboptimal code-gen of a cross-lane shuffle by MSVC, no way to fix + dst += 8; + dst2 += 8; + } + refPic += 16; + } + } + else { + remain = puHeight & 1; + height = puHeight - remain; + + for (colCount = 0; colCount < puWidth; colCount += 8) { + ptr = refPic; + for (rowCount = 0; rowCount < height; rowCount += 2) { + __m256i d0 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)ptr)); + __m256i d1 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 1))); + __m256i d2 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 2))); + __m256i d3 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 3))); + __m256i sum1 = _mm256_set1_epi16(OFFSET2D1_10BIT >> 1); + ptr += srcStride; + + { // fixing MSVC code-gen of reg-mem VINSERT instructions + EB_U16 *ptr_ = ptr; + ptr += srcStride; + d0 = _mm256_inserti128_si256(d0, _mm_loadu_si128((__m128i *)ptr_), 1); + d1 = _mm256_inserti128_si256(d1, _mm_loadu_si128((__m128i *)(ptr_ + 1)), 1); + d2 = _mm256_inserti128_si256(d2, _mm_loadu_si128((__m128i *)(ptr_ + 2)), 1); + d3 = _mm256_inserti128_si256(d3, _mm_loadu_si128((__m128i *)(ptr_ + 3)), 1); + } + + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); + sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); + sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); + + _mm256_storeu_si256((__m256i *)dst, sum1); + dst += 16; + } + + for (rowCount = 0; rowCount < remain; rowCount++) { + a0 = _mm_loadu_si128((__m128i *)ptr); + a1 = _mm_loadu_si128((__m128i *)(ptr + 1)); + a2 = _mm_loadu_si128((__m128i *)(ptr + 2)); + a3 = _mm_loadu_si128((__m128i *)(ptr + 3)); + ptr += srcStride; + + sum = _mm_set1_epi16(OFFSET2D1_10BIT >> 1); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); + sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); + sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, sum); + dst += 8; + } + refPic += 8; + } + } } diff --git a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c index aaa1813e9..a07bf67ca 100644 --- a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c +++ b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c @@ -10,243 +10,243 @@ #include "EbUtility.h" EB_EXTERN EB_ALIGN(16) const EB_U8 filterType[] = { - 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4 + 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4 }; EB_EXTERN EB_ALIGN(16) const EB_U8 WeakChromafilter[2][32] = { - { 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4 }, - { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 }, + { 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4 }, + { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 }, }; inline void lumaWeakFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - EB_U8 *ptrDenoised, - EB_U8 *ptrNoise - ) + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + EB_U8 *ptrDenoised, + EB_U8 *ptrNoise + ) { - __m256i topFirstHalf, bottomFirstHalf, - filterFirstHalf, filterSecondHalf, - currNextFirstHalf, currNextSecondHalf, - weights, currLeftMidFirstHalfWeight, - currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, - topPermutation, bottomPermutation; - - currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); - currPermutation = _mm256_permute4x64_epi64(curr, 216); - currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); - weights = _mm256_loadu_si256((__m256i*)filterType); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); - currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); - currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); - - currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); - currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); - currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); - - - topPermutation = _mm256_permute4x64_epi64(top, 216); - topFirstHalf = _mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()); - bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); - bottomFirstHalf = _mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()); - filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalflo); - filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 3); - - - topFirstHalf = _mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()); - bottomFirstHalf = _mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()); - filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalfhi); - filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 3); - - filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); - _mm256_storeu_si256((__m256i *)(ptrDenoised ), filterFirstHalf); - - _mm256_storeu_si256((__m256i *)(ptrNoise), _mm256_subs_epu8(curr, filterFirstHalf)); + __m256i topFirstHalf, bottomFirstHalf, + filterFirstHalf, filterSecondHalf, + currNextFirstHalf, currNextSecondHalf, + weights, currLeftMidFirstHalfWeight, + currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, + topPermutation, bottomPermutation; + + currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); + currPermutation = _mm256_permute4x64_epi64(curr, 216); + currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); + weights = _mm256_loadu_si256((__m256i*)filterType); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); + currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); + currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); + + currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); + currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); + currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); + + + topPermutation = _mm256_permute4x64_epi64(top, 216); + topFirstHalf = _mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()); + bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); + bottomFirstHalf = _mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()); + filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalflo); + filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 3); + + + topFirstHalf = _mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()); + bottomFirstHalf = _mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()); + filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalfhi); + filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 3); + + filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); + _mm256_storeu_si256((__m256i *)(ptrDenoised ), filterFirstHalf); + + _mm256_storeu_si256((__m256i *)(ptrNoise), _mm256_subs_epu8(curr, filterFirstHalf)); } inline void chromaWeakLumaStrongFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised - ) + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised + ) { - __m256i filterFirstHalf, filterSecondHalf, - currNextFirstHalf, currNextSecondHalf, - weights, currLeftMidFirstHalfWeight, - currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, - topPermutation, bottomPermutation, - topPrevPermutation, topLeftMidFirstHalflo, topLeftMidFirstHalfWeight, topNextFirstHalf, - topNextPermutation, topLeftMidFirstHalfhi, topNextSecondHalf, - bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomLeftMidFirstHalfWeight, bottomNextPermutation, - bottomNextFirstHalf, bottomLeftMidFirstHalfhi, bottomNextSecondHalf; - - - // Curr - currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); - currPermutation = _mm256_permute4x64_epi64(curr, 216); - currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); - weights = _mm256_loadu_si256((__m256i*)WeakChromafilter[0]); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); - currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); - currNextFirstHalf = _mm256_slli_epi16(currNextFirstHalf, 1); - currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); - - currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); - currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); - currNextSecondHalf = _mm256_slli_epi16(currNextSecondHalf, 1); - currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); - - // Top - topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); - topPermutation = _mm256_permute4x64_epi64(top, 216); - topLeftMidFirstHalflo = _mm256_unpacklo_epi8(topPrevPermutation, topPermutation); - weights = _mm256_loadu_si256((__m256i*)WeakChromafilter[1]); - topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalflo, weights); - topNextPermutation = _mm256_permute4x64_epi64(topNext, 88); - topNextFirstHalf = _mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()); - topLeftMidFirstHalflo = _mm256_add_epi16(topNextFirstHalf, topLeftMidFirstHalfWeight); - - topLeftMidFirstHalfhi = _mm256_unpackhi_epi8(topPrevPermutation, topPermutation); - topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalfhi, weights); - topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); - topNextSecondHalf = _mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()); - topLeftMidFirstHalfhi = _mm256_add_epi16(topNextSecondHalf, topLeftMidFirstHalfWeight); - - - // Bottom - bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); - bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); - bottomLeftMidFirstHalflo = _mm256_unpacklo_epi8(bottomPrevPermutation, bottomPermutation); - weights = _mm256_loadu_si256((__m256i*)WeakChromafilter[1]); - bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalflo, weights); - bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 88); - bottomNextFirstHalf = _mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()); - bottomLeftMidFirstHalflo = _mm256_add_epi16(bottomNextFirstHalf, bottomLeftMidFirstHalfWeight); - - bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi8(bottomPrevPermutation, bottomPermutation); - bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalfhi, weights); - bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); - bottomNextSecondHalf = _mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()); - bottomLeftMidFirstHalfhi = _mm256_add_epi16(bottomNextSecondHalf, bottomLeftMidFirstHalfWeight); - - - filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalflo, topLeftMidFirstHalflo), currLeftMidFirstHalflo); - filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 4); - filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalfhi, topLeftMidFirstHalfhi), currLeftMidFirstHalfhi); - filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 4); - - - filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); - _mm256_storeu_si256((__m256i *)(ptrDenoised), filterFirstHalf); + __m256i filterFirstHalf, filterSecondHalf, + currNextFirstHalf, currNextSecondHalf, + weights, currLeftMidFirstHalfWeight, + currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, + topPermutation, bottomPermutation, + topPrevPermutation, topLeftMidFirstHalflo, topLeftMidFirstHalfWeight, topNextFirstHalf, + topNextPermutation, topLeftMidFirstHalfhi, topNextSecondHalf, + bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomLeftMidFirstHalfWeight, bottomNextPermutation, + bottomNextFirstHalf, bottomLeftMidFirstHalfhi, bottomNextSecondHalf; + + + // Curr + currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); + currPermutation = _mm256_permute4x64_epi64(curr, 216); + currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); + weights = _mm256_loadu_si256((__m256i*)WeakChromafilter[0]); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); + currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); + currNextFirstHalf = _mm256_slli_epi16(currNextFirstHalf, 1); + currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); + + currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); + currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); + currNextSecondHalf = _mm256_slli_epi16(currNextSecondHalf, 1); + currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); + + // Top + topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); + topPermutation = _mm256_permute4x64_epi64(top, 216); + topLeftMidFirstHalflo = _mm256_unpacklo_epi8(topPrevPermutation, topPermutation); + weights = _mm256_loadu_si256((__m256i*)WeakChromafilter[1]); + topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalflo, weights); + topNextPermutation = _mm256_permute4x64_epi64(topNext, 88); + topNextFirstHalf = _mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()); + topLeftMidFirstHalflo = _mm256_add_epi16(topNextFirstHalf, topLeftMidFirstHalfWeight); + + topLeftMidFirstHalfhi = _mm256_unpackhi_epi8(topPrevPermutation, topPermutation); + topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalfhi, weights); + topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); + topNextSecondHalf = _mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()); + topLeftMidFirstHalfhi = _mm256_add_epi16(topNextSecondHalf, topLeftMidFirstHalfWeight); + + + // Bottom + bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); + bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); + bottomLeftMidFirstHalflo = _mm256_unpacklo_epi8(bottomPrevPermutation, bottomPermutation); + weights = _mm256_loadu_si256((__m256i*)WeakChromafilter[1]); + bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalflo, weights); + bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 88); + bottomNextFirstHalf = _mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()); + bottomLeftMidFirstHalflo = _mm256_add_epi16(bottomNextFirstHalf, bottomLeftMidFirstHalfWeight); + + bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi8(bottomPrevPermutation, bottomPermutation); + bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalfhi, weights); + bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); + bottomNextSecondHalf = _mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()); + bottomLeftMidFirstHalfhi = _mm256_add_epi16(bottomNextSecondHalf, bottomLeftMidFirstHalfWeight); + + + filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalflo, topLeftMidFirstHalflo), currLeftMidFirstHalflo); + filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 4); + filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalfhi, topLeftMidFirstHalfhi), currLeftMidFirstHalfhi); + filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 4); + + + filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); + _mm256_storeu_si256((__m256i *)(ptrDenoised), filterFirstHalf); } inline void ChromaStrong_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised - ) + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised + ) { - __m256i currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, - topPermutation, topPrevPermutation, topLeftMidFirstHalflo, topNextPermutation, topLeftMidFirstHalfhi, - bottomPermutation, bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomNextPermutation, bottomLeftMidFirstHalfhi; + __m256i currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, + topPermutation, topPrevPermutation, topLeftMidFirstHalflo, topNextPermutation, topLeftMidFirstHalfhi, + bottomPermutation, bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomNextPermutation, bottomLeftMidFirstHalfhi; - currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); - currPermutation = _mm256_permute4x64_epi64(curr, 216); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); + currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); + currPermutation = _mm256_permute4x64_epi64(curr, 216); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); - currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currPermutation, _mm256_setzero_si256()), - _mm256_unpacklo_epi8(currPrevPermutation, _mm256_setzero_si256())); - currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalflo); + currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currPermutation, _mm256_setzero_si256()), + _mm256_unpacklo_epi8(currPrevPermutation, _mm256_setzero_si256())); + currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalflo); - currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currPermutation, _mm256_setzero_si256()), - _mm256_unpackhi_epi8(currPrevPermutation, _mm256_setzero_si256())); - currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalfhi); + currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currPermutation, _mm256_setzero_si256()), + _mm256_unpackhi_epi8(currPrevPermutation, _mm256_setzero_si256())); + currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalfhi); - topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); - topPermutation = _mm256_permute4x64_epi64(top, 216); - topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); + topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); + topPermutation = _mm256_permute4x64_epi64(top, 216); + topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); - topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()), - _mm256_unpacklo_epi8(topPrevPermutation, _mm256_setzero_si256())); - topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalflo); + topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()), + _mm256_unpacklo_epi8(topPrevPermutation, _mm256_setzero_si256())); + topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalflo); - topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()), - _mm256_unpackhi_epi8(topPrevPermutation, _mm256_setzero_si256())); - topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalfhi); + topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()), + _mm256_unpackhi_epi8(topPrevPermutation, _mm256_setzero_si256())); + topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalfhi); - bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); - bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); - bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); + bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); + bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); + bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); - bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()), - _mm256_unpacklo_epi8(bottomPrevPermutation, _mm256_setzero_si256())); - bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalflo); + bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()), + _mm256_unpacklo_epi8(bottomPrevPermutation, _mm256_setzero_si256())); + bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalflo); - bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()), - _mm256_unpackhi_epi8(bottomPrevPermutation, _mm256_setzero_si256())); - bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalfhi); + bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()), + _mm256_unpackhi_epi8(bottomPrevPermutation, _mm256_setzero_si256())); + bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalfhi); - currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalflo, topLeftMidFirstHalflo), bottomLeftMidFirstHalflo); - currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalfhi, topLeftMidFirstHalfhi), bottomLeftMidFirstHalfhi); + currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalflo, topLeftMidFirstHalflo), bottomLeftMidFirstHalflo); + currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalfhi, topLeftMidFirstHalfhi), bottomLeftMidFirstHalfhi); - topLeftMidFirstHalflo = _mm256_unpacklo_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); - topLeftMidFirstHalflo = _mm256_mullo_epi32(topLeftMidFirstHalflo, _mm256_set1_epi32(7282)); - topLeftMidFirstHalflo = _mm256_srli_epi32(topLeftMidFirstHalflo, 16); - bottomLeftMidFirstHalflo = _mm256_unpackhi_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); - bottomLeftMidFirstHalflo = _mm256_mullo_epi32(bottomLeftMidFirstHalflo, _mm256_set1_epi32(7282)); - bottomLeftMidFirstHalflo = _mm256_srli_epi32(bottomLeftMidFirstHalflo, 16); - currLeftMidFirstHalflo = _mm256_packus_epi32(topLeftMidFirstHalflo, bottomLeftMidFirstHalflo); + topLeftMidFirstHalflo = _mm256_unpacklo_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); + topLeftMidFirstHalflo = _mm256_mullo_epi32(topLeftMidFirstHalflo, _mm256_set1_epi32(7282)); + topLeftMidFirstHalflo = _mm256_srli_epi32(topLeftMidFirstHalflo, 16); + bottomLeftMidFirstHalflo = _mm256_unpackhi_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); + bottomLeftMidFirstHalflo = _mm256_mullo_epi32(bottomLeftMidFirstHalflo, _mm256_set1_epi32(7282)); + bottomLeftMidFirstHalflo = _mm256_srli_epi32(bottomLeftMidFirstHalflo, 16); + currLeftMidFirstHalflo = _mm256_packus_epi32(topLeftMidFirstHalflo, bottomLeftMidFirstHalflo); - currLeftMidFirstHalflo = _mm256_insertf128_si256(_mm256_setzero_si256(), _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalflo, 0), _mm256_extracti128_si256(currLeftMidFirstHalflo, 1)), 0); + currLeftMidFirstHalflo = _mm256_insertf128_si256(_mm256_setzero_si256(), _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalflo, 0), _mm256_extracti128_si256(currLeftMidFirstHalflo, 1)), 0); - topLeftMidFirstHalfhi = _mm256_unpacklo_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); - topLeftMidFirstHalfhi = _mm256_mullo_epi32(topLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); - topLeftMidFirstHalfhi = _mm256_srli_epi32(topLeftMidFirstHalfhi, 16); + topLeftMidFirstHalfhi = _mm256_unpacklo_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); + topLeftMidFirstHalfhi = _mm256_mullo_epi32(topLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); + topLeftMidFirstHalfhi = _mm256_srli_epi32(topLeftMidFirstHalfhi, 16); - bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); - bottomLeftMidFirstHalfhi = _mm256_mullo_epi32(bottomLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); - bottomLeftMidFirstHalfhi = _mm256_srli_epi32(bottomLeftMidFirstHalfhi, 16); - currLeftMidFirstHalfhi = _mm256_packus_epi32(topLeftMidFirstHalfhi, bottomLeftMidFirstHalfhi); + bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); + bottomLeftMidFirstHalfhi = _mm256_mullo_epi32(bottomLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); + bottomLeftMidFirstHalfhi = _mm256_srli_epi32(bottomLeftMidFirstHalfhi, 16); + currLeftMidFirstHalfhi = _mm256_packus_epi32(topLeftMidFirstHalfhi, bottomLeftMidFirstHalfhi); - currLeftMidFirstHalflo = _mm256_insertf128_si256(currLeftMidFirstHalflo, _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalfhi, 0), _mm256_extracti128_si256(currLeftMidFirstHalfhi, 1)), 1); - _mm256_storeu_si256((__m256i *)(ptrDenoised), currLeftMidFirstHalflo); + currLeftMidFirstHalflo = _mm256_insertf128_si256(currLeftMidFirstHalflo, _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalfhi, 0), _mm256_extracti128_si256(currLeftMidFirstHalfhi, 1)), 1); + _mm256_storeu_si256((__m256i *)(ptrDenoised), currLeftMidFirstHalflo); } @@ -255,293 +255,293 @@ inline void ChromaStrong_AVX2_INTRIN( * weak filter Luma and store noise. *******************************************/ void noiseExtractLumaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; - - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised, *ptrDenoisedInterm; - - EB_U8 *ptrNoise, *ptrNoiseInterm; - EB_U32 strideOut; - - __m256i top, curr, bottom, currPrev, currNext, - secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; - (void)lcuOriginX; - - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; - - noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - ptrNoiseInterm = ptrNoise; - - ////Luma - //a = (p[1] + - // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + - // p[1 + 2 * stride]) / 8; - - top = curr = secondtop = secondcurr = _mm256_setzero_si256(); - - for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) - { - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); - _mm256_storeu_si256((__m256i *)(ptrNoise + kk), _mm256_setzero_si256()); - _mm256_storeu_si256((__m256i *)(ptrNoise + kk + 32), _mm256_setzero_si256()); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - ptrNoiseInterm = ptrNoise + kk + ((1 + jj)*strideOut); - - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj *strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn - strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn - strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - ptrNoiseInterm = ptrNoise + kk + jj*strideOut; - - } - - lumaWeakFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - ptrDenoisedInterm, - ptrNoiseInterm); - - lumaWeakFilter_AVX2_INTRIN( - secondtop, - secondcurr, - secondbottom, - secondcurrPrev, - secondcurrNext, - ptrDenoisedInterm + 32, - ptrNoiseInterm + 32); - - top = curr; - curr = bottom; - secondtop = secondcurr; - secondcurr = secondbottom; - - } - - - } - - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ - - if (!((jj0 && ii < picWidth - 1)){ - - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } - - } - } - - } + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; + + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised, *ptrDenoisedInterm; + + EB_U8 *ptrNoise, *ptrNoiseInterm; + EB_U32 strideOut; + + __m256i top, curr, bottom, currPrev, currNext, + secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; + (void)lcuOriginX; + + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; + + noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + ptrNoiseInterm = ptrNoise; + + ////Luma + //a = (p[1] + + // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + + // p[1 + 2 * stride]) / 8; + + top = curr = secondtop = secondcurr = _mm256_setzero_si256(); + + for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) + { + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); + _mm256_storeu_si256((__m256i *)(ptrNoise + kk), _mm256_setzero_si256()); + _mm256_storeu_si256((__m256i *)(ptrNoise + kk + 32), _mm256_setzero_si256()); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + ptrNoiseInterm = ptrNoise + kk + ((1 + jj)*strideOut); + + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj *strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn - strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn - strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + ptrNoiseInterm = ptrNoise + kk + jj*strideOut; + + } + + lumaWeakFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + ptrDenoisedInterm, + ptrNoiseInterm); + + lumaWeakFilter_AVX2_INTRIN( + secondtop, + secondcurr, + secondbottom, + secondcurrPrev, + secondcurrNext, + ptrDenoisedInterm + 32, + ptrNoiseInterm + 32); + + top = curr; + curr = bottom; + secondtop = secondcurr; + secondcurr = secondbottom; + + } + + + } + + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ + + if (!((jj0 && ii < picWidth - 1)){ + + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } + + } + } + + } } void noiseExtractLumaWeakLcu_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth, lcuWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; - - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised, *ptrDenoisedInterm; - - EB_U8 *ptrNoise, *ptrNoiseInterm; - EB_U32 strideOut; - - __m256i top, curr, bottom, currPrev, currNext, - secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; - (void)lcuOriginX; - - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); - lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - - inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; - - noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - ptrNoiseInterm = ptrNoise; - - ////Luma - //a = (p[1] + - // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + - // p[1 + 2 * stride]) / 8; - - top = curr = secondtop = secondcurr = _mm256_setzero_si256(); - - //for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) - { - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn)); - _mm256_storeu_si256((__m256i *)(ptrDenoised ), top); - _mm256_storeu_si256((__m256i *)(ptrDenoised + 32), secondtop); - _mm256_storeu_si256((__m256i *)(ptrNoise ), _mm256_setzero_si256()); - _mm256_storeu_si256((__m256i *)(ptrNoise + 32), _mm256_setzero_si256()); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut); - ptrNoiseInterm = ptrNoise + ((1 + jj)*strideOut); - - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn - strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj *strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn - strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn - strideIn)); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn - strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn - strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn - strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn - strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut - strideOut); - ptrNoiseInterm = ptrNoise + jj*strideOut; - - } - - lumaWeakFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - ptrDenoisedInterm, - ptrNoiseInterm); - - lumaWeakFilter_AVX2_INTRIN( - secondtop, - secondcurr, - secondbottom, - secondcurrPrev, - secondcurrNext, - ptrDenoisedInterm + 32, - ptrNoiseInterm + 32); - - top = curr; - curr = bottom; - secondtop = secondcurr; - secondcurr = secondbottom; - - } - - - } - - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < lcuWidth; ii++){ - - if (!((jj>0 || lcuOriginY>0) && (jj0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1)){ - - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } - - } - } - - } + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth, lcuWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; + + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised, *ptrDenoisedInterm; + + EB_U8 *ptrNoise, *ptrNoiseInterm; + EB_U32 strideOut; + + __m256i top, curr, bottom, currPrev, currNext, + secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; + (void)lcuOriginX; + + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); + lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + + inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; + + noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + ptrNoiseInterm = ptrNoise; + + ////Luma + //a = (p[1] + + // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + + // p[1 + 2 * stride]) / 8; + + top = curr = secondtop = secondcurr = _mm256_setzero_si256(); + + //for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) + { + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn)); + _mm256_storeu_si256((__m256i *)(ptrDenoised ), top); + _mm256_storeu_si256((__m256i *)(ptrDenoised + 32), secondtop); + _mm256_storeu_si256((__m256i *)(ptrNoise ), _mm256_setzero_si256()); + _mm256_storeu_si256((__m256i *)(ptrNoise + 32), _mm256_setzero_si256()); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut); + ptrNoiseInterm = ptrNoise + ((1 + jj)*strideOut); + + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn - strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj *strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn - strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn - strideIn)); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn - strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn - strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn - strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn - strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut - strideOut); + ptrNoiseInterm = ptrNoise + jj*strideOut; + + } + + lumaWeakFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + ptrDenoisedInterm, + ptrNoiseInterm); + + lumaWeakFilter_AVX2_INTRIN( + secondtop, + secondcurr, + secondbottom, + secondcurrPrev, + secondcurrNext, + ptrDenoisedInterm + 32, + ptrNoiseInterm + 32); + + top = curr; + curr = bottom; + secondtop = secondcurr; + secondcurr = secondbottom; + + } + + + } + + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < lcuWidth; ii++){ + + if (!((jj>0 || lcuOriginY>0) && (jj0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1)){ + + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } + + } + } + + } } /******************************************* @@ -549,173 +549,173 @@ void noiseExtractLumaWeakLcu_AVX2_INTRIN( * strong filter Luma. *******************************************/ void noiseExtractLumaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised, *ptrDenoisedInterm; - - EB_U32 strideOut; - __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, - secondtop, secondcurr, secondcurrPrev, secondcurrNext, secondbottom, secondtopPrev, secondtopNext, secondbottomPrev, secondbottomNext; - (void)lcuOriginX; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; - - - top = curr = secondtop = secondcurr = topNext = topPrev = currNext = currPrev = secondcurrPrev = secondcurrNext = secondtopPrev = secondtopNext = _mm256_setzero_si256(); - for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) - { - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); - - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); - - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); - secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn))); - - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); - secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn))); - - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn))); - - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn))); - - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); - secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn))); - - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); - secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn))); - - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); - secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn) - strideIn)); - - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); - secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn) - strideIn)); - - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); - - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); - secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); - - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); - secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); - - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); - - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - - } - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - topPrev, - topNext, - bottomPrev, - bottomNext, - ptrDenoisedInterm); - - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - secondtop, - secondcurr, - secondbottom, - secondcurrPrev, - secondcurrNext, - secondtopPrev, - secondtopNext, - secondbottomPrev, - secondbottomNext, - ptrDenoisedInterm + 32); - - - top = curr; - curr = bottom; - topPrev = currPrev; - topNext = currNext; - currPrev = bottomPrev; - currNext = bottomNext; - secondtop = secondcurr; - secondcurr = secondbottom; - secondtopPrev = secondcurrPrev; - secondtopNext = secondcurrNext; - secondcurrPrev = secondbottomPrev; - secondcurrNext = secondbottomNext; - - } - - - } - - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ - - if (!((jj0 && ii < picWidth - 1)){ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } - - } - } - - } + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised, *ptrDenoisedInterm; + + EB_U32 strideOut; + __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, + secondtop, secondcurr, secondcurrPrev, secondcurrNext, secondbottom, secondtopPrev, secondtopNext, secondbottomPrev, secondbottomNext; + (void)lcuOriginX; + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; + + + top = curr = secondtop = secondcurr = topNext = topPrev = currNext = currPrev = secondcurrPrev = secondcurrNext = secondtopPrev = secondtopNext = _mm256_setzero_si256(); + for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) + { + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); + + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); + + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); + secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn))); + + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); + secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn))); + + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn))); + + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn))); + + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); + secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn))); + + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); + secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn))); + + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); + secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn) - strideIn)); + + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); + secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn) - strideIn)); + + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); + + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); + secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); + + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); + secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); + + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); + + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + + } + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + topPrev, + topNext, + bottomPrev, + bottomNext, + ptrDenoisedInterm); + + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + secondtop, + secondcurr, + secondbottom, + secondcurrPrev, + secondcurrNext, + secondtopPrev, + secondtopNext, + secondbottomPrev, + secondbottomNext, + ptrDenoisedInterm + 32); + + + top = curr; + curr = bottom; + topPrev = currPrev; + topNext = currNext; + currPrev = bottomPrev; + currNext = bottomNext; + secondtop = secondcurr; + secondcurr = secondbottom; + secondtopPrev = secondcurrPrev; + secondtopNext = secondcurrNext; + secondcurrPrev = secondbottomPrev; + secondcurrNext = secondbottomNext; + + } + + + } + + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ + + if (!((jj0 && ii < picWidth - 1)){ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } + + } + } + + } } @@ -724,179 +724,179 @@ void noiseExtractLumaStrong_AVX2_INTRIN( * strong filter chroma. *******************************************/ void noiseExtractChromaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn, *ptrInCr; - EB_U32 strideIn, strideInCr; - EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; + EB_U8 *ptrIn, *ptrInCr; + EB_U32 strideIn, strideInCr; + EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; - EB_U32 strideOut, strideOutCr; + EB_U32 strideOut, strideOutCr; EB_U32 colorFormat=inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat==EB_YUV444?1:2)-1; EB_U16 subHeightCMinus1 = (colorFormat>=EB_YUV422?1:2)-1; - __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, - topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; - (void)lcuOriginX; - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; + __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, + topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; + (void)lcuOriginX; + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); lcuHeight = ((lcuOriginY + (MAX_LCU_SIZE >> subHeightCMinus1) >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideCb; + strideIn = inputPicturePtr->strideCb; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; - strideInCr = inputPicturePtr->strideCr; + strideInCr = inputPicturePtr->strideCr; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; - ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); + ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; - strideOutCr = denoisedPicturePtr->strideCr; - ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - ptrDenoisedIntermCr = ptrDenoisedCr; - ////Chroma - //a = (4 * p[0] + 4 * p[1] + 4 * p[2] + - // 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + - // 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; - - top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); - - for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) - { - - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); - - - } - - ChromaStrong_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - topPrev, - topNext, - bottomPrev, - bottomNext, - ptrDenoisedInterm); - - ChromaStrong_AVX2_INTRIN( - topCr, - currCr, - bottomCr, - currPrevCr, - currNextCr, - topPrevCr, - topNextCr, - bottomPrevCr, - bottomNextCr, - ptrDenoisedIntermCr); - - top = curr; - curr = bottom; - topPrev = currPrev; - topNext = currNext; - currPrev = bottomPrev; - currNext = bottomNext; - topCr = currCr; - currCr = bottomCr; - topPrevCr = currPrevCr; - topNextCr = currNextCr; - currPrevCr = bottomPrevCr; - currNextCr = bottomNextCr; - - } - - - } + strideOutCr = denoisedPicturePtr->strideCr; + ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + ptrDenoisedIntermCr = ptrDenoisedCr; + ////Chroma + //a = (4 * p[0] + 4 * p[1] + 4 * p[2] + + // 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + + // 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; + + top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); + + for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) + { + + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); + + + } + + ChromaStrong_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + topPrev, + topNext, + bottomPrev, + bottomNext, + ptrDenoisedInterm); + + ChromaStrong_AVX2_INTRIN( + topCr, + currCr, + bottomCr, + currPrevCr, + currNextCr, + topPrevCr, + topNextCr, + bottomPrevCr, + bottomNextCr, + ptrDenoisedIntermCr); + + top = curr; + curr = bottom; + topPrev = currPrev; + topNext = currNext; + currPrev = bottomPrev; + currNext = bottomNext; + topCr = currCr; + currCr = bottomCr; + topPrevCr = currPrevCr; + topNextCr = currNextCr; + currPrevCr = bottomPrevCr; + currNextCr = bottomNextCr; + + } + + + } lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ - if (!((jj0 && ii < picWidth - 1)){ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideIn]; - } + if (!((jj0 && ii < picWidth - 1)){ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideIn]; + } - } - } - } + } + } + } } @@ -906,38 +906,38 @@ void noiseExtractChromaStrong_AVX2_INTRIN( * weak filter chroma. *******************************************/ void noiseExtractChromaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn, *ptrInCr; - EB_U32 strideIn, strideInCr; - EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; + EB_U8 *ptrIn, *ptrInCr; + EB_U32 strideIn, strideInCr; + EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; - EB_U32 strideOut, strideOutCr; + EB_U32 strideOut, strideOutCr; EB_U32 colorFormat=inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat==EB_YUV444?1:2)-1; EB_U16 subHeightCMinus1 = (colorFormat>=EB_YUV422?1:2)-1; - __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, - topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; - (void)lcuOriginX; + __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, + topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; + (void)lcuOriginX; - ////gaussian matrix(Chroma) - //a = (1 * p[0] + 2 * p[1] + 1 * p[2] + - // 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - // 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; + ////gaussian matrix(Chroma) + //a = (1 * p[0] + 2 * p[1] + 1 * p[2] + + // 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + // 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; - { + { picHeight = inputPicturePtr->height >> subHeightCMinus1; picWidth = inputPicturePtr->width >> subWidthCMinus1 ; @@ -945,143 +945,143 @@ void noiseExtractChromaWeak_AVX2_INTRIN( lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); lcuHeight = ((lcuOriginY + (MAX_LCU_SIZE >> subHeightCMinus1) >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideCb; + strideIn = inputPicturePtr->strideCb; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; - strideInCr = inputPicturePtr->strideCr; + strideInCr = inputPicturePtr->strideCr; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; - ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); + ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; - strideOutCr = denoisedPicturePtr->strideCr; - ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - ptrDenoisedIntermCr = ptrDenoisedCr; - - top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); - for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) - { - - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); - _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); - - } - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - topPrev, - topNext, - bottomPrev, - bottomNext, - ptrDenoisedInterm); - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - topCr, - currCr, - bottomCr, - currPrevCr, - currNextCr, - topPrevCr, - topNextCr, - bottomPrevCr, - bottomNextCr, - ptrDenoisedIntermCr); - - - top = curr; - curr = bottom; - topPrev = currPrev; - topNext = currNext; - currPrev = bottomPrev; - currNext = bottomNext; - topCr = currCr; - currCr = bottomCr; - topPrevCr = currPrevCr; - topNextCr = currNextCr; - currPrevCr = bottomPrevCr; - currNextCr = bottomNextCr; - - } - - - } + strideOutCr = denoisedPicturePtr->strideCr; + ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + ptrDenoisedIntermCr = ptrDenoisedCr; + + top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); + for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) + { + + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); + _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); + + } + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + topPrev, + topNext, + bottomPrev, + bottomNext, + ptrDenoisedInterm); + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + topCr, + currCr, + bottomCr, + currPrevCr, + currNextCr, + topPrevCr, + topNextCr, + bottomPrevCr, + bottomNextCr, + ptrDenoisedIntermCr); + + + top = curr; + curr = bottom; + topPrev = currPrev; + topNext = currNext; + currPrev = bottomPrev; + currNext = bottomNext; + topCr = currCr; + currCr = bottomCr; + topPrevCr = currPrevCr; + topNextCr = currNextCr; + currPrevCr = bottomPrevCr; + currNextCr = bottomNextCr; + + } + + + } lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ - if (!((jj0 && ii < picWidth - 1)){ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideInCr]; - } + if (!((jj0 && ii < picWidth - 1)){ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideInCr]; + } - } - } - } + } + } + } } diff --git a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h index 548847d1d..f58404718 100644 --- a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h +++ b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h @@ -19,75 +19,75 @@ extern "C" { * weak filter Luma and store noise. *******************************************/ void noiseExtractLumaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractLumaWeakLcu_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractChromaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); void noiseExtractChromaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); void noiseExtractLumaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); void ChromaStrong_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised); + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised); void lumaWeakFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - EB_U8 *ptrDenoised, - EB_U8 *ptrNoise); + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + EB_U8 *ptrDenoised, + EB_U8 *ptrNoise); void chromaWeakLumaStrongFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised); + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised); #ifdef __cplusplus } -#endif +#endif #endif // EbNoiseExtractAVX2_h diff --git a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c index f4f73ab13..5e18dd0ea 100644 --- a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c @@ -78,7 +78,7 @@ void EB_ENC_msbUnPack2D_AVX512_INTRIN( { EB_U16 inPixel2 = in16BitBuffer[y]; out8BitBuffer[y] = (EB_U8)(inPixel2 >> 2); - + EB_U8 tmpPixel2 = (EB_U8)(inPixel2 << 6); outnBitBuffer[y] = tmpPixel2; } diff --git a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h index 5b6b6ed00..492c5e347 100644 --- a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h @@ -14,14 +14,14 @@ extern "C" { #ifndef NON_AVX512_SUPPORT void EB_ENC_msbUnPack2D_AVX512_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U8 *outnBitBuffer, - EB_U32 out8Stride, - EB_U32 outnStride, - EB_U32 width, - EB_U32 height); + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U8 *outnBitBuffer, + EB_U32 out8Stride, + EB_U32 outnStride, + EB_U32 width, + EB_U32 height); #else void EB_ENC_msbUnPack2D_AVX2_INTRIN( EB_U16 *in16BitBuffer, diff --git a/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h b/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h index 0ac0edaab..5192ff353 100644 --- a/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h @@ -13,44 +13,44 @@ extern "C" { #endif extern void EB_ENC_msbPack2D_AVX2_INTRIN_AL( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height); extern void CompressedPackmsb_AVX2_INTRIN( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height); void CPack_AVX2_INTRIN( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); void UnpackAvg_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height); @@ -67,7 +67,7 @@ void memset16bitBlock_AVX2_INTRIN ( void UnpackAvgSafeSub_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, diff --git a/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c index d0a23c53d..3b5467dfa 100644 --- a/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c @@ -235,12 +235,12 @@ void CompressedPackmsb_AVX2_INTRIN( in8Bit = _mm256_loadu_si256((__m256i*)in8BitBuffer); in8Bit32 = _mm256_loadu_si256((__m256i*)(in8BitBuffer + 32)); - //(outPixel | nBitPixel) concatenation + //(outPixel | nBitPixel) concatenation concat0 = _mm256_srli_epi16(_mm256_unpacklo_epi8(inNBit, in8Bit), 6); concat1 = _mm256_srli_epi16(_mm256_unpackhi_epi8(inNBit, in8Bit), 6); concat2 = _mm256_srli_epi16(_mm256_unpacklo_epi8(inNBit32, in8Bit32), 6); concat3 = _mm256_srli_epi16(_mm256_unpackhi_epi8(inNBit32, in8Bit32), 6); - + _mm_storeu_si128((__m128i*) out16BitBuffer, _mm256_castsi256_si128(concat0)); _mm_storeu_si128((__m128i*) (out16BitBuffer + 8), _mm256_castsi256_si128(concat1)); _mm_storeu_si128((__m128i*) (out16BitBuffer + 16), _mm256_extracti128_si256(concat0, 1)); @@ -265,202 +265,202 @@ void CompressedPackmsb_AVX2_INTRIN( void CPack_AVX2_INTRIN( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - - EB_U32 width, - EB_U32 height) -{ + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, - EB_U32 y; + EB_U32 width, + EB_U32 height) +{ - if (width == 32) - { - __m256i inNBit; + EB_U32 y; - __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp; - __m256i msk0, msk1, msk2, msk3; + if (width == 32) + { + __m256i inNBit; - msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 - msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 - msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 - msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 + __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp; + __m256i msk0, msk1, msk2, msk3; - //One row per iter - for (y = 0; y < height; y++) - { + msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 + msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 + msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 + msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 + //One row per iter + for (y = 0; y < height; y++) + { - inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp = _mm256_packus_epi32(ext0123, ext0123n); - extp = _mm256_packus_epi16(extp, extp); - _mm_storel_epi64((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); - inCompnBitBuffer += 8; - innBitBuffer += innStride; + extp = _mm256_packus_epi32(ext0123, ext0123n); + extp = _mm256_packus_epi16(extp, extp); + _mm_storel_epi64((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); + inCompnBitBuffer += 8; + innBitBuffer += innStride; - } - } - else if (width == 64) - { - __m256i inNBit; - __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp, extp1; - __m256i msk0, msk1, msk2, msk3; + } - msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 - msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 - msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 - msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 - if (height == 64) - { + } + else if (width == 64) + { + __m256i inNBit; + __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp, extp1; + __m256i msk0, msk1, msk2, msk3; + + msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 + msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 + msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 + msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 + if (height == 64) + { - EB_U8* localPtr = localCache; + EB_U8* localPtr = localCache; - for (y = 0; y < height; y++) - { + for (y = 0; y < height; y++) + { - inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); + inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp = _mm256_packus_epi32(ext0123, ext0123n); - extp = _mm256_packus_epi16(extp, extp); + extp = _mm256_packus_epi32(ext0123, ext0123n); + extp = _mm256_packus_epi16(extp, extp); - inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); + inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp1 = _mm256_packus_epi32(ext0123, ext0123n); - extp1 = _mm256_packus_epi16(extp1, extp1); + extp1 = _mm256_packus_epi32(ext0123, ext0123n); + extp1 = _mm256_packus_epi16(extp1, extp1); - extp = _mm256_unpacklo_epi64(extp, extp1); + extp = _mm256_unpacklo_epi64(extp, extp1); - _mm_storeu_si128((__m128i*) (localPtr + 16 * (y & 3)), _mm256_castsi256_si128(extp)); + _mm_storeu_si128((__m128i*) (localPtr + 16 * (y & 3)), _mm256_castsi256_si128(extp)); - if ((y & 3) == 3) - { - __m256i c0 = _mm256_loadu_si256((__m256i*)(localPtr)); - __m256i c1 = _mm256_loadu_si256((__m256i*)(localPtr + 32)); - _mm256_stream_si256((__m256i*)&inCompnBitBuffer[0], c0); - _mm256_stream_si256((__m256i*)&inCompnBitBuffer[32], c1); - inCompnBitBuffer += 4 * outStride; - } + if ((y & 3) == 3) + { + __m256i c0 = _mm256_loadu_si256((__m256i*)(localPtr)); + __m256i c1 = _mm256_loadu_si256((__m256i*)(localPtr + 32)); + _mm256_stream_si256((__m256i*)&inCompnBitBuffer[0], c0); + _mm256_stream_si256((__m256i*)&inCompnBitBuffer[32], c1); + inCompnBitBuffer += 4 * outStride; + } - innBitBuffer += innStride; + innBitBuffer += innStride; - } + } - } - else{ + } + else{ - //One row per iter - for (y = 0; y < height; y++) - { + //One row per iter + for (y = 0; y < height; y++) + { - inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); + inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp = _mm256_packus_epi32(ext0123, ext0123n); - extp = _mm256_packus_epi16(extp, extp); + extp = _mm256_packus_epi32(ext0123, ext0123n); + extp = _mm256_packus_epi16(extp, extp); - inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); + inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp1 = _mm256_packus_epi32(ext0123, ext0123n); - extp1 = _mm256_packus_epi16(extp1, extp1); + extp1 = _mm256_packus_epi32(ext0123, ext0123n); + extp1 = _mm256_packus_epi16(extp1, extp1); - extp = _mm256_unpacklo_epi64(extp, extp1); + extp = _mm256_unpacklo_epi64(extp, extp1); - _mm_storeu_si128((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); + _mm_storeu_si128((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); - inCompnBitBuffer += outStride; + inCompnBitBuffer += outStride; - innBitBuffer += innStride; + innBitBuffer += innStride; - } + } - } + } - } + } } void EB_ENC_msbPack2D_AVX2_INTRIN_AL( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height) + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height) { //(outPixel | nBitPixel) concatenation is done with unpacklo_epi8 and unpackhi_epi8 - EB_U32 y, x; + EB_U32 y, x; __m128i out0, out1; - if (width == 4) - { - for (y = 0; y < height; y += 2){ + if (width == 4) + { + for (y = 0; y < height; y += 2){ out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)innBitBuffer), _mm_cvtsi32_si128(*(EB_U32 *)in8BitBuffer)), 6); out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)(innBitBuffer + innStride)), _mm_cvtsi32_si128(*(EB_U32 *)(in8BitBuffer + in8Stride))), 6); @@ -468,31 +468,31 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm_storel_epi64((__m128i*) out16BitBuffer, out0); _mm_storel_epi64((__m128i*) (out16BitBuffer + outStride), out1); - in8BitBuffer += in8Stride << 1; - innBitBuffer += innStride << 1; - out16BitBuffer += outStride << 1; - } - } - else if (width == 8) - { - for (y = 0; y < height; y += 2){ + in8BitBuffer += in8Stride << 1; + innBitBuffer += innStride << 1; + out16BitBuffer += outStride << 1; + } + } + else if (width == 8) + { + for (y = 0; y < height; y += 2){ - out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); - out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); + out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); + out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); _mm_storeu_si128((__m128i*) out16BitBuffer, out0); _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out1); - in8BitBuffer += in8Stride << 1; - innBitBuffer += innStride << 1; - out16BitBuffer += outStride << 1; - } - } - else if (width == 16) - { + in8BitBuffer += in8Stride << 1; + innBitBuffer += innStride << 1; + out16BitBuffer += outStride << 1; + } + } + else if (width == 16) + { __m128i inNBit, in8Bit, inNBitStride, in8BitStride, out0, out1, out2, out3; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ inNBit = _mm_loadu_si128((__m128i*)innBitBuffer); in8Bit = _mm_loadu_si128((__m128i*)in8BitBuffer); inNBitStride = _mm_loadu_si128((__m128i*)(innBitBuffer + innStride)); @@ -508,17 +508,17 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out2); _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride + 8), out3); - in8BitBuffer += in8Stride << 1; - innBitBuffer += innStride << 1; - out16BitBuffer += outStride << 1; - } - } - else if (width == 32) - { + in8BitBuffer += in8Stride << 1; + innBitBuffer += innStride << 1; + out16BitBuffer += outStride << 1; + } + } + else if (width == 32) + { __m256i inNBit, in8Bit, inNBitStride, in8BitStride, concat0, concat1, concat2, concat3; __m256i out0_15, out16_31, out_s0_s15, out_s16_s31; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); in8Bit = _mm256_loadu_si256((__m256i*)in8BitBuffer); @@ -542,19 +542,19 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm256_store_si256((__m256i*) (out16BitBuffer + outStride), out_s0_s15); _mm256_store_si256((__m256i*) (out16BitBuffer + outStride + 16), out_s16_s31); - in8BitBuffer += in8Stride << 1; - //innBitBuffer += innStride << 1; + in8BitBuffer += in8Stride << 1; + //innBitBuffer += innStride << 1; innBitBuffer += innStride *2; - out16BitBuffer += outStride << 1; - } - } - else if (width == 64) - { + out16BitBuffer += outStride << 1; + } + } + else if (width == 64) + { __m256i inNBit, in8Bit, inNBitStride, in8BitStride, inNBit32, in8Bit32, inNBitStride32, in8BitStride32; __m256i concat0, concat1, concat2, concat3, concat4, concat5, concat6, concat7; __m256i out_0_15, out16_31, out32_47, out_48_63, out_s0_s15, out_s16_s31, out_s32_s47, out_s48_s63; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); in8Bit = _mm256_loadu_si256((__m256i*)in8BitBuffer); @@ -594,166 +594,166 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm256_store_si256((__m256i*) (out16BitBuffer + outStride + 32), out_s32_s47); _mm256_store_si256((__m256i*) (out16BitBuffer + outStride + 48), out_s48_s63); - in8BitBuffer += in8Stride << 1; - //innBitBuffer += innStride << 1; + in8BitBuffer += in8Stride << 1; + //innBitBuffer += innStride << 1; innBitBuffer += innStride *2; - out16BitBuffer += outStride << 1; - } - } - else - { + out16BitBuffer += outStride << 1; + } + } + else + { EB_U32 innStrideDiff = 2 * innStride; - EB_U32 in8StrideDiff = 2 * in8Stride; - EB_U32 outStrideDiff = 2 * outStride; - innStrideDiff -= width; - in8StrideDiff -= width; - outStrideDiff -= width; - - if (!(width & 7)){ - - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 8){ - - out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); - out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); - - _mm_storeu_si128((__m128i*) out16BitBuffer, out0); - _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out1); - - in8BitBuffer += 8; - innBitBuffer += 8; - out16BitBuffer += 8; - } - in8BitBuffer += in8StrideDiff; - innBitBuffer += innStrideDiff; - out16BitBuffer += outStrideDiff; - } - } - else{ - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 4){ - - out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)innBitBuffer), _mm_cvtsi32_si128(*(EB_U32 *)in8BitBuffer)), 6); - out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)(innBitBuffer + innStride)), _mm_cvtsi32_si128(*(EB_U32 *)(in8BitBuffer + in8Stride))), 6); - - _mm_storel_epi64((__m128i*) out16BitBuffer, out0); - _mm_storel_epi64((__m128i*) (out16BitBuffer + outStride), out1); - - in8BitBuffer += 4; - innBitBuffer += 4; - out16BitBuffer += 4; - } - in8BitBuffer += in8StrideDiff; - innBitBuffer += innStrideDiff; - out16BitBuffer += outStrideDiff; - } - } - } + EB_U32 in8StrideDiff = 2 * in8Stride; + EB_U32 outStrideDiff = 2 * outStride; + innStrideDiff -= width; + in8StrideDiff -= width; + outStrideDiff -= width; + + if (!(width & 7)){ + + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 8){ + + out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); + out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); + + _mm_storeu_si128((__m128i*) out16BitBuffer, out0); + _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out1); + + in8BitBuffer += 8; + innBitBuffer += 8; + out16BitBuffer += 8; + } + in8BitBuffer += in8StrideDiff; + innBitBuffer += innStrideDiff; + out16BitBuffer += outStrideDiff; + } + } + else{ + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 4){ + + out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)innBitBuffer), _mm_cvtsi32_si128(*(EB_U32 *)in8BitBuffer)), 6); + out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)(innBitBuffer + innStride)), _mm_cvtsi32_si128(*(EB_U32 *)(in8BitBuffer + in8Stride))), 6); + + _mm_storel_epi64((__m128i*) out16BitBuffer, out0); + _mm_storel_epi64((__m128i*) (out16BitBuffer + outStride), out1); + + in8BitBuffer += 4; + innBitBuffer += 4; + out16BitBuffer += 4; + } + in8BitBuffer += in8StrideDiff; + innBitBuffer += innStrideDiff; + out16BitBuffer += outStrideDiff; + } + } + } } #define ALSTORE 1 #define B256 1 void UnpackAvg_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - EB_U32 y; - __m128i inPixel0, inPixel1; + EB_U32 y; + __m128i inPixel0, inPixel1; - - if (width == 4) - { + + if (width == 4) + { __m128i out8_0_U8_L0, out8_0_U8_L1; __m128i avg8_0_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L1); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)dstPtr = _mm_cvtsi128_si32(avg8_0_U8); - //-------- + //-------- //Line Two //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L0+ refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L1+ refL1Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)(dstPtr+dstStride) = _mm_cvtsi128_si32(avg8_0_U8); dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; - - } - - } - else if (width == 8) - { - + ref16L1 += 2*refL1Stride; + + } + + } + else if (width == 8) + { + __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 - inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); + inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + + _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - //-------- //Line Two @@ -763,37 +763,37 @@ void UnpackAvg_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*)(ref16L0 + refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*)(ref16L1 + refL1Stride) ); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 16) - { + + } + else if (width == 16) + { __m128i inPixel4, inPixel5; __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- @@ -802,24 +802,24 @@ void UnpackAvg_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); inPixel1 = _mm_loadu_si128((__m128i*) (ref16L0 + 8)); - - out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); + + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); - inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); - + inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - + //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); #if ALSTORE _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); #else - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); -#endif + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); +#endif //-------- //Line Two @@ -828,34 +828,34 @@ void UnpackAvg_AVX2_INTRIN( //List0 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - //List1 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - - //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); #if ALSTORE - _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); #else - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); #endif dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 32) - { + + } + else if (width == 32) + { #if B256 __m256i inVal16b_0,inVal16b_1; @@ -866,10 +866,10 @@ void UnpackAvg_AVX2_INTRIN( __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; __m128i avg8_0_U8, avg8_1_U8, avg8_2_U8, avg8_3_U8; -#endif +#endif for (y = 0; y < height; y += 2) - { + { #if B256 //-------- @@ -878,44 +878,44 @@ void UnpackAvg_AVX2_INTRIN( //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L0); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); - data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L1); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); - + //-------- //Line Two //-------- //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride + 16)); - + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - + //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride + 16)); - + data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + + avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - _mm256_storeu_si256((__m256i *)(dstPtr + dstStride ), avg8b_32_0); - + #else //-------- //Line One @@ -929,7 +929,7 @@ void UnpackAvg_AVX2_INTRIN( inPixel3 = _mm_loadu_si128((__m128i*) (ref16L0 + 24)); out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //List1 @@ -937,19 +937,19 @@ void UnpackAvg_AVX2_INTRIN( inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(ref16L1 + 16)); inPixel3 = _mm_loadu_si128((__m128i*)(ref16L1 + 24)); - + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //AVG avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); - avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); + avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); #if ALSTORE _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); #else - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); #endif //-------- @@ -963,7 +963,7 @@ void UnpackAvg_AVX2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 24)); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //List1 @@ -973,37 +973,37 @@ void UnpackAvg_AVX2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 24)); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - + //AVG avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); - avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); + avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); #if ALSTORE _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_store_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); + _mm_store_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); #else - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); -#endif - -#endif + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); +#endif + +#endif dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 64) - { - + } + else if (width == 64) + { + #if B256 __m256i inVal16b_0,inVal16b_1,inVal16b_2,inVal16b_3; __m256i data8b_32_0_L0,data8b_32_1_L0,data8b_32_0_L1,data8b_32_1_L1; __m256i avg8b_32_0,avg8b_32_1; -#else +#else __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; @@ -1011,8 +1011,8 @@ void UnpackAvg_AVX2_INTRIN( #endif - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { #if B256 // _mm256_lddqu_si256 @@ -1030,15 +1030,15 @@ void UnpackAvg_AVX2_INTRIN( inVal16b_3 = _mm256_loadu_si256((__m256i*)(ref16L1 + 48)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); data8b_32_1_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_2, 2) , _mm256_srli_epi16 (inVal16b_3, 2)); - - + + //Avg avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_1 = _mm256_avg_epu8(data8b_32_1_L0,data8b_32_1_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); avg8b_32_1 = _mm256_permute4x64_epi64(avg8b_32_1, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); _mm256_storeu_si256((__m256i *)(dstPtr + 32), avg8b_32_1); #else @@ -1051,16 +1051,16 @@ void UnpackAvg_AVX2_INTRIN( inPixel5 = _mm_loadu_si128((__m128i*)(ref16L0 + 40)); inPixel6 = _mm_loadu_si128((__m128i*)(ref16L0 + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(ref16L0 + 56)); - + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - - + + //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); @@ -1072,10 +1072,10 @@ void UnpackAvg_AVX2_INTRIN( inPixel7 = _mm_loadu_si128((__m128i*)(ref16L1 + 56)); - //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels + //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //AVG @@ -1085,23 +1085,23 @@ void UnpackAvg_AVX2_INTRIN( avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); #if ALSTORE _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); - _mm_store_si128((__m128i*)(dstPtr + 32), avg8_2_U8); - _mm_store_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_store_si128((__m128i*)(dstPtr + 32), avg8_2_U8); + _mm_store_si128((__m128i*)(dstPtr + 48), avg8_3_U8); #else - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); #endif - + #endif - dstPtr += dstStride; + dstPtr += dstStride; ref16L0 += refL0Stride; - ref16L1 += refL1Stride; - } - } - + ref16L1 += refL1Stride; + } + } + return; } @@ -1121,7 +1121,7 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( //Assumption: 9bit or 11bit residual data . for bigger block sizes or bigger bit depths , re-asses the dynamic range of the internal calculation if(size==4){ //SSSE3 - + __m128i zer = _mm_setzero_si128(); in0 = _mm_loadl_epi64((__m128i*)inPtr); @@ -1143,9 +1143,9 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( sumBlock = _mm_cvtsi128_si32 (sum); return sumBlock; - + }else if(size==8){//SSSE3 - + __m128i zer = _mm_setzero_si128(); sum = _mm_add_epi16 (_mm_loadu_si128((__m128i*)(inPtr+0*strideIn)), _mm_loadu_si128((__m128i*)(inPtr+1*strideIn))); @@ -1164,12 +1164,12 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( sumBlock = _mm_cvtsi128_si32 (sum); return sumBlock; - + }else if(size==16){//AVX2 sum0 = _mm256_add_epi16 (_mm256_loadu_si256((__m256i *)(inPtr+0*strideIn)), _mm256_loadu_si256((__m256i *)(inPtr+1*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+2*strideIn))); - sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); + sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+4*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+5*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+6*strideIn))); @@ -1178,29 +1178,29 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( inPtr+=8*strideIn; sum1 = _mm256_add_epi16 (_mm256_loadu_si256((__m256i *)(inPtr+0*strideIn)), _mm256_loadu_si256((__m256i *)(inPtr+1*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+2*strideIn))); - sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); + sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+4*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+5*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+6*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+7*strideIn))); - sum01 = _mm256_add_epi16 (sum0,sum1); - + sum01 = _mm256_add_epi16 (sum0,sum1); + //go from 16bit to 32bit (to support big values) sumL = _mm256_castsi256_si128(sum01); sumH = _mm256_extracti128_si256(sum01,1); sum0L = _mm256_cvtepi16_epi32(sumL); sum0H = _mm256_cvtepi16_epi32(sumH); - sumT = _mm256_add_epi32(sum0L,sum0H); + sumT = _mm256_add_epi32(sum0L,sum0H); - sumT = _mm256_hadd_epi32(sumT,sumT); - sumT = _mm256_hadd_epi32(sumT,sumT); - sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 + sumT = _mm256_hadd_epi32(sumT,sumT); + sumT = _mm256_hadd_epi32(sumT,sumT); + sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 sumT = _mm256_add_epi32(sumT,sumTPerm); - sum = _mm256_castsi256_si128(sumT); - sumBlock = _mm_cvtsi128_si32 (sum); + sum = _mm256_castsi256_si128(sumT); + sumBlock = _mm_cvtsi128_si32 (sum); return sumBlock; @@ -1248,7 +1248,7 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( sumT = _mm256_hadd_epi32(sumT, sumT); sumT = _mm256_hadd_epi32(sumT, sumT); - sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 + sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 sumT = _mm256_add_epi32(sumT, sumTPerm); sum = _mm256_castsi256_si128(sumT); @@ -1273,18 +1273,18 @@ void memset16bitBlock_AVX2_INTRIN ( { - if(size==4){ + if(size==4){ - __m128i line = _mm_set1_epi16 (value); + __m128i line = _mm_set1_epi16 (value); _mm_storel_epi64 ((__m128i *)(inPtr + 0*strideIn), line); _mm_storel_epi64 ((__m128i *)(inPtr + 1*strideIn), line); _mm_storel_epi64 ((__m128i *)(inPtr + 2*strideIn), line); _mm_storel_epi64 ((__m128i *)(inPtr + 3*strideIn), line); - + }else if(size==8){ - - __m128i line = _mm_set1_epi16 (value); + + __m128i line = _mm_set1_epi16 (value); _mm_storeu_si128((__m128i *)(inPtr + 0*strideIn), line); _mm_storeu_si128((__m128i *)(inPtr + 1*strideIn), line); @@ -1294,10 +1294,10 @@ void memset16bitBlock_AVX2_INTRIN ( _mm_storeu_si128((__m128i *)(inPtr + 5*strideIn), line); _mm_storeu_si128((__m128i *)(inPtr + 6*strideIn), line); _mm_storeu_si128((__m128i *)(inPtr + 7*strideIn), line); - + }else if(size==16){ - __m256i line = _mm256_set1_epi16(value); + __m256i line = _mm256_set1_epi16(value); _mm256_storeu_si256((__m256i *)(inPtr + 0*strideIn), line); _mm256_storeu_si256((__m256i *)(inPtr + 1*strideIn), line); @@ -1405,50 +1405,50 @@ void memset16bitBlock_AVX2_INTRIN ( } void UnpackAvgSafeSub_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - EB_U32 y; - __m128i inPixel0, inPixel1; + EB_U32 y; + __m128i inPixel0, inPixel1; + - if (width == 8) - { - + { + __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 - inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); + inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); - _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); + _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); //-------- //Line Two @@ -1458,37 +1458,37 @@ void UnpackAvgSafeSub_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*)(ref16L0 + refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*)(ref16L1 + refL1Stride) ); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 16) - { + + } + else if (width == 16) + { __m128i inPixel4, inPixel5; __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; for (y = 0; y < height; y += 2) - { + { //-------- //Line One @@ -1498,19 +1498,19 @@ void UnpackAvgSafeSub_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); inPixel1 = _mm_loadu_si128((__m128i*) (ref16L0 + 8)); - - out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); + + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); - inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); - + inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - + //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); @@ -1521,102 +1521,102 @@ void UnpackAvgSafeSub_AVX2_INTRIN( //List0 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - //List1 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - - //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); - _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 32) - { + } + else if (width == 32) + { __m256i inVal16b_0,inVal16b_1; __m256i data8b_32_0_L0,data8b_32_0_L1; - __m256i avg8b_32_0; + __m256i avg8b_32_0; for (y = 0; y < height; y += 2) - { - + { + //-------- //Line One //-------- //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L0); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); - data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L1); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); - + //-------- //Line Two //-------- //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride + 16)); - + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - + //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride + 16)); - + data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + + avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - _mm256_storeu_si256((__m256i *)(dstPtr + dstStride ), avg8b_32_0); - - + + dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 64) - { + } + else if (width == 64) + { __m256i inVal16b_0,inVal16b_1,inVal16b_2,inVal16b_3; __m256i data8b_32_0_L0,data8b_32_1_L0,data8b_32_0_L1,data8b_32_1_L1; __m256i avg8b_32_0,avg8b_32_1; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { //List0 @@ -1633,26 +1633,26 @@ void UnpackAvgSafeSub_AVX2_INTRIN( inVal16b_3 = _mm256_loadu_si256((__m256i*)(ref16L1 + 48)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); data8b_32_1_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_2, 2) , _mm256_srli_epi16 (inVal16b_3, 2)); - - + + //Avg avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_1 = _mm256_avg_epu8(data8b_32_1_L0,data8b_32_1_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); avg8b_32_1 = _mm256_permute4x64_epi64(avg8b_32_1, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); _mm256_storeu_si256((__m256i *)(dstPtr + 32), avg8b_32_1); - dstPtr += dstStride; + dstPtr += dstStride; ref16L0 += refL0Stride; - ref16L1 += refL1Stride; - } + ref16L1 += refL1Stride; + } + + } - } - return; } diff --git a/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h b/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h index 30be3e941..846a59311 100644 --- a/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h @@ -12,95 +12,95 @@ extern "C" { #endif void QuantizeInvQuantize8x8_AVX2_INTRIN( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff); void QuantizeInvQuantizeNxN_AVX2_INTRIN( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff); void lowPrecisionTransform16x16_AVX2_INTRIN(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_stride, EB_S16 *intermediate, EB_U32 addshift); void lowPrecisionTransform32x32_AVX2_INTRIN(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_stride, EB_S16 *intermediate, EB_U32 addshift); void PfreqTransform32x32_AVX2_INTRIN( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift); + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift); void PfreqN4Transform32x32_AVX2_INTRIN( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift); + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift); void MatMult4x4_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff); + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff); void MatMult4x4_OutBuff_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, + EB_S16* coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32* nonzerocoeff); + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32* nonzerocoeff); void MatMult8x8_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff); + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff); void MatMultNxN_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff); + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff); diff --git a/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c index 71cea045c..89bfb1dcd 100644 --- a/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c @@ -171,12 +171,12 @@ void QuantizeInvQuantizeNxN_AVX2_INTRIN( z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(x, _mm256_setzero_si256())); x = _mm256_sign_epi16(x, y); _mm256_storeu_si256((__m256i *)(quantCoeff + coeffStride*row + col), x); - __m256i zer = _mm256_setzero_si256(); - __m256i cmp = _mm256_cmpeq_epi16(x, zer); - int msk = _mm256_movemask_epi8(cmp); + __m256i zer = _mm256_setzero_si256(); + __m256i cmp = _mm256_cmpeq_epi16(x, zer); + int msk = _mm256_movemask_epi8(cmp); - if ((EB_U32)msk != 0xFFFFFFFF) - { + if ((EB_U32)msk != 0xFFFFFFFF) + { a0 = _mm256_mullo_epi16(x, iqq); a1 = _mm256_mulhi_epi16(x, iqq); b0 = _mm256_unpacklo_epi16(a0, a1); @@ -187,10 +187,10 @@ void QuantizeInvQuantizeNxN_AVX2_INTRIN( b1 = _mm256_sra_epi32(b1, is); x = _mm256_packs_epi32(b0, b1); _mm256_storeu_si256((__m256i *)(reconCoeff + coeffStride*row + col), x); - } - else{ - _mm256_storeu_si256((__m256i *)(reconCoeff + coeffStride*row + col), zer); - } + } + else{ + _mm256_storeu_si256((__m256i *)(reconCoeff + coeffStride*row + col), zer); + } col += 16; } while (col < areaSize); @@ -251,12 +251,12 @@ void QuantizeInvQuantize8x8_AVX2_INTRIN( x = _mm256_sign_epi16(x, y); _mm_storeu_si128((__m128i *)(quantCoeff + coeffStride*row), _mm256_extracti128_si256(x, 0)); _mm_storeu_si128((__m128i *)(quantCoeff + coeffStride*(row + 1)), _mm256_extracti128_si256(x, 1)); - __m256i zer = _mm256_setzero_si256(); - __m256i cmp = _mm256_cmpeq_epi16(x, zer); - int msk = _mm256_movemask_epi8(cmp); + __m256i zer = _mm256_setzero_si256(); + __m256i cmp = _mm256_cmpeq_epi16(x, zer); + int msk = _mm256_movemask_epi8(cmp); - if ((EB_U32)msk != 0xFFFFFFFF) - { + if ((EB_U32)msk != 0xFFFFFFFF) + { a0 = _mm256_mullo_epi16(x, iqq); a1 = _mm256_mulhi_epi16(x, iqq); b0 = _mm256_unpacklo_epi16(a0, a1); @@ -268,11 +268,11 @@ void QuantizeInvQuantize8x8_AVX2_INTRIN( x = _mm256_packs_epi32(b0, b1); _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*row), _mm256_extracti128_si256(x, 0)); _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*(row + 1)), _mm256_extracti128_si256(x, 1)); - } - else{ - _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*row), _mm_setzero_si128()); - _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*(row + 1)), _mm_setzero_si128()); - } + } + else{ + _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*row), _mm_setzero_si128()); + _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*(row + 1)), _mm_setzero_si128()); + } row += 2; } while (row < 8); @@ -480,71 +480,71 @@ void PfreqTranspose32_AVX2_INTRIN( } void PfreqSecTranspose32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i; - // for (i = 0; i < 4; i++) - for (i = 0; i < 2; i++) - { - __m256i a0, a1, a2, a3, a4, a5, a6, a7; - __m256i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); - a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); - a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); - a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); - a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); - a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); - a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); - a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); - - b0 = _mm256_unpacklo_epi16(a0, a4); - b1 = _mm256_unpacklo_epi16(a1, a5); - b2 = _mm256_unpacklo_epi16(a2, a6); - b3 = _mm256_unpacklo_epi16(a3, a7); - b4 = _mm256_unpackhi_epi16(a0, a4); - b5 = _mm256_unpackhi_epi16(a1, a5); - b6 = _mm256_unpackhi_epi16(a2, a6); - b7 = _mm256_unpackhi_epi16(a3, a7); - - a0 = _mm256_unpacklo_epi16(b0, b2); - a1 = _mm256_unpacklo_epi16(b1, b3); - a2 = _mm256_unpackhi_epi16(b0, b2); - a3 = _mm256_unpackhi_epi16(b1, b3); - a4 = _mm256_unpacklo_epi16(b4, b6); - a5 = _mm256_unpacklo_epi16(b5, b7); - a6 = _mm256_unpackhi_epi16(b4, b6); - a7 = _mm256_unpackhi_epi16(b5, b7); - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - b2 = _mm256_unpacklo_epi16(a2, a3); - b3 = _mm256_unpackhi_epi16(a2, a3); - b4 = _mm256_unpacklo_epi16(a4, a5); - b5 = _mm256_unpackhi_epi16(a4, a5); - b6 = _mm256_unpacklo_epi16(a6, a7); - b7 = _mm256_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); - _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); - _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); - _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); - _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); - _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); - _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); - _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); - _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); - _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); - _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); - _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); - _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); - _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); - _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); - _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); - } + EB_U32 i; + // for (i = 0; i < 4; i++) + for (i = 0; i < 2; i++) + { + __m256i a0, a1, a2, a3, a4, a5, a6, a7; + __m256i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); + a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); + a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); + a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); + a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); + a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); + a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); + a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); + + b0 = _mm256_unpacklo_epi16(a0, a4); + b1 = _mm256_unpacklo_epi16(a1, a5); + b2 = _mm256_unpacklo_epi16(a2, a6); + b3 = _mm256_unpacklo_epi16(a3, a7); + b4 = _mm256_unpackhi_epi16(a0, a4); + b5 = _mm256_unpackhi_epi16(a1, a5); + b6 = _mm256_unpackhi_epi16(a2, a6); + b7 = _mm256_unpackhi_epi16(a3, a7); + + a0 = _mm256_unpacklo_epi16(b0, b2); + a1 = _mm256_unpacklo_epi16(b1, b3); + a2 = _mm256_unpackhi_epi16(b0, b2); + a3 = _mm256_unpackhi_epi16(b1, b3); + a4 = _mm256_unpacklo_epi16(b4, b6); + a5 = _mm256_unpacklo_epi16(b5, b7); + a6 = _mm256_unpackhi_epi16(b4, b6); + a7 = _mm256_unpackhi_epi16(b5, b7); + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + b2 = _mm256_unpacklo_epi16(a2, a3); + b3 = _mm256_unpackhi_epi16(a2, a3); + b4 = _mm256_unpacklo_epi16(a4, a5); + b5 = _mm256_unpackhi_epi16(a4, a5); + b6 = _mm256_unpacklo_epi16(a6, a7); + b7 = _mm256_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); + _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); + _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); + _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); + _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); + _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); + _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); + _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); + _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); + _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); + _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); + _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); + _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); + _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); + _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); + _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); + } } // 16-point forward transform (16 rows) @@ -1024,434 +1024,434 @@ void PfreqTransform32x32_AVX2_INTRIN( Pfreq1DTransform32_AVX2_INTRIN(src, src_stride, intermediate, 32, 6 + addshift); PfreqTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); Pfreq2DTransform32_AVX2_INTRIN(dst, dst_stride, intermediate, 32, 9); - PfreqSecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); + PfreqSecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); return; } void PfreqN41DTransform32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) { - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); - const __m256i *coeff32 = (const __m256i *)coeff_tbl_AVX2; - - for (i = 0; i < 32; i += 2) - { - __m256i x0, x1, x2, x3; - __m256i y0, y1, y2, y3; - __m256i a0, a2, a4, a5; - __m256i b0, b2, b4, b5; - - //b1=s0; - //b3=s0; - - x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); - x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); - x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); - x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); - - // 32-point butterfly - x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - y0 = _mm256_add_epi16(x0, x3); - y1 = _mm256_add_epi16(x1, x2); - - y2 = _mm256_sub_epi16(x0, x3); - y3 = _mm256_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - x0 = _mm256_add_epi16(y0, y1); - x1 = _mm256_sub_epi16(y0, y1); - - x2 = y2; - x3 = y3; - - a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); - - a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); - //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); - b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); - //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); - b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); - b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); - //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); - //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); - - x0 = _mm256_packs_epi32(b0, b0); - x1 = _mm256_packs_epi32(b2, b2); - x2 = _mm256_packs_epi32(b4, b5); - //x3 = _mm256_packs_epi32(b6, b7); - - y0 = _mm256_unpacklo_epi16(x0, x1); - //y1 = _mm256_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm256_unpacklo_epi16(y0, y2); - //--// x1 = _mm256_unpackhi_epi16(y0, y2); - //x2 = _mm256_unpacklo_epi16(y1, y3); - //x3 = _mm256_unpackhi_epi16(y1, y3); - - //--// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); - //--// y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); - //--// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); - //--// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); - _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); - - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); - } + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); + const __m256i *coeff32 = (const __m256i *)coeff_tbl_AVX2; + + for (i = 0; i < 32; i += 2) + { + __m256i x0, x1, x2, x3; + __m256i y0, y1, y2, y3; + __m256i a0, a2, a4, a5; + __m256i b0, b2, b4, b5; + + //b1=s0; + //b3=s0; + + x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); + x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); + x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); + x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); + + // 32-point butterfly + x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + y0 = _mm256_add_epi16(x0, x3); + y1 = _mm256_add_epi16(x1, x2); + + y2 = _mm256_sub_epi16(x0, x3); + y3 = _mm256_sub_epi16(x1, x2); + + // 16-point butterfly + y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + x0 = _mm256_add_epi16(y0, y1); + x1 = _mm256_sub_epi16(y0, y1); + + x2 = y2; + x3 = y3; + + a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); + + //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); + + a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); + + //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); + + a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); + + b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); + //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); + b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); + //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); + b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); + b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); + //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); + //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); + + x0 = _mm256_packs_epi32(b0, b0); + x1 = _mm256_packs_epi32(b2, b2); + x2 = _mm256_packs_epi32(b4, b5); + //x3 = _mm256_packs_epi32(b6, b7); + + y0 = _mm256_unpacklo_epi16(x0, x1); + //y1 = _mm256_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm256_unpacklo_epi16(y0, y2); + //--// x1 = _mm256_unpackhi_epi16(y0, y2); + //x2 = _mm256_unpacklo_epi16(y1, y3); + //x3 = _mm256_unpackhi_epi16(y1, y3); + + //--// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); + //--// y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); + //--// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); + //--// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); + _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); + + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); + } } void PfreqN42DTransform32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) { - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); - const __m256i *coeff32 = (const __m256i *)coeff_tbl_AVX2; - - //for (i = 0; i < 16; i += 2) - for (i = 0; i < 8; i += 2) - { - __m256i x0, x1, x2, x3; - __m256i y0, y1, y2, y3; - __m256i a0, a2, a4, a5; - __m256i b0, b2, b4, b5; - - //b1=s0; - //b3=s0; - - x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); - x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); - x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); - x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); - - // 32-point butterfly - x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - y0 = _mm256_add_epi16(x0, x3); - y1 = _mm256_add_epi16(x1, x2); - - y2 = _mm256_sub_epi16(x0, x3); - y3 = _mm256_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - x0 = _mm256_add_epi16(y0, y1); - x1 = _mm256_sub_epi16(y0, y1); - - x2 = y2; - x3 = y3; - - a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); - - a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); - //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); - b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); - //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); - b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); - b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); - //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); - //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); - - x0 = _mm256_packs_epi32(b0, b0); - x1 = _mm256_packs_epi32(b2, b2); - x2 = _mm256_packs_epi32(b4, b5); - //x3 = _mm256_packs_epi32(b6, b7); - - y0 = _mm256_unpacklo_epi16(x0, x1); - //y1 = _mm256_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm256_unpacklo_epi16(y0, y2); - //---// x1 = _mm256_unpackhi_epi16(y0, y2); - //x2 = _mm256_unpacklo_epi16(y1, y3); - //x3 = _mm256_unpackhi_epi16(y1, y3); - - //---// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); - //---//y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); - - //---// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); - //---// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); - _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); - - - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); - } + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); + const __m256i *coeff32 = (const __m256i *)coeff_tbl_AVX2; + + //for (i = 0; i < 16; i += 2) + for (i = 0; i < 8; i += 2) + { + __m256i x0, x1, x2, x3; + __m256i y0, y1, y2, y3; + __m256i a0, a2, a4, a5; + __m256i b0, b2, b4, b5; + + //b1=s0; + //b3=s0; + + x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); + x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); + x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); + x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); + + // 32-point butterfly + x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + y0 = _mm256_add_epi16(x0, x3); + y1 = _mm256_add_epi16(x1, x2); + + y2 = _mm256_sub_epi16(x0, x3); + y3 = _mm256_sub_epi16(x1, x2); + + // 16-point butterfly + y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + x0 = _mm256_add_epi16(y0, y1); + x1 = _mm256_sub_epi16(y0, y1); + + x2 = y2; + x3 = y3; + + a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); + + //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); + + a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); + + //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); + + a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); + + b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); + //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); + b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); + //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); + b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); + b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); + //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); + //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); + + x0 = _mm256_packs_epi32(b0, b0); + x1 = _mm256_packs_epi32(b2, b2); + x2 = _mm256_packs_epi32(b4, b5); + //x3 = _mm256_packs_epi32(b6, b7); + + y0 = _mm256_unpacklo_epi16(x0, x1); + //y1 = _mm256_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm256_unpacklo_epi16(y0, y2); + //---// x1 = _mm256_unpackhi_epi16(y0, y2); + //x2 = _mm256_unpacklo_epi16(y1, y3); + //x3 = _mm256_unpackhi_epi16(y1, y3); + + //---// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); + //---//y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); + + //---// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); + //---// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); + _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); + + + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); + } } void PfreqN4FirstTranspose32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i; - for (i = 0; i < 4; i++) - { - __m256i a0, a1, a2, a3, a4, a5, a6, a7; - __m256i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); - a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); - a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); - a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); - a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); - a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); - a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); - a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); - - b0 = _mm256_unpacklo_epi16(a0, a4); - b1 = _mm256_unpacklo_epi16(a1, a5); - b2 = _mm256_unpacklo_epi16(a2, a6); - b3 = _mm256_unpacklo_epi16(a3, a7); - b4 = _mm256_unpackhi_epi16(a0, a4); - b5 = _mm256_unpackhi_epi16(a1, a5); - b6 = _mm256_unpackhi_epi16(a2, a6); - b7 = _mm256_unpackhi_epi16(a3, a7); - - a0 = _mm256_unpacklo_epi16(b0, b2); - a1 = _mm256_unpacklo_epi16(b1, b3); - a2 = _mm256_unpackhi_epi16(b0, b2); - a3 = _mm256_unpackhi_epi16(b1, b3); - a4 = _mm256_unpacklo_epi16(b4, b6); - a5 = _mm256_unpacklo_epi16(b5, b7); - a6 = _mm256_unpackhi_epi16(b4, b6); - a7 = _mm256_unpackhi_epi16(b5, b7); - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - b2 = _mm256_unpacklo_epi16(a2, a3); - b3 = _mm256_unpackhi_epi16(a2, a3); - b4 = _mm256_unpacklo_epi16(a4, a5); - b5 = _mm256_unpackhi_epi16(a4, a5); - b6 = _mm256_unpacklo_epi16(a6, a7); - b7 = _mm256_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); - _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); - _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); - _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); - _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); - _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); - _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); - _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); - _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); - _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); - _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); - _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); - _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); - _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); - _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); - _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); - } + EB_U32 i; + for (i = 0; i < 4; i++) + { + __m256i a0, a1, a2, a3, a4, a5, a6, a7; + __m256i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); + a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); + a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); + a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); + a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); + a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); + a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); + a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); + + b0 = _mm256_unpacklo_epi16(a0, a4); + b1 = _mm256_unpacklo_epi16(a1, a5); + b2 = _mm256_unpacklo_epi16(a2, a6); + b3 = _mm256_unpacklo_epi16(a3, a7); + b4 = _mm256_unpackhi_epi16(a0, a4); + b5 = _mm256_unpackhi_epi16(a1, a5); + b6 = _mm256_unpackhi_epi16(a2, a6); + b7 = _mm256_unpackhi_epi16(a3, a7); + + a0 = _mm256_unpacklo_epi16(b0, b2); + a1 = _mm256_unpacklo_epi16(b1, b3); + a2 = _mm256_unpackhi_epi16(b0, b2); + a3 = _mm256_unpackhi_epi16(b1, b3); + a4 = _mm256_unpacklo_epi16(b4, b6); + a5 = _mm256_unpacklo_epi16(b5, b7); + a6 = _mm256_unpackhi_epi16(b4, b6); + a7 = _mm256_unpackhi_epi16(b5, b7); + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + b2 = _mm256_unpacklo_epi16(a2, a3); + b3 = _mm256_unpackhi_epi16(a2, a3); + b4 = _mm256_unpacklo_epi16(a4, a5); + b5 = _mm256_unpackhi_epi16(a4, a5); + b6 = _mm256_unpacklo_epi16(a6, a7); + b7 = _mm256_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); + _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); + _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); + _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); + _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); + _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); + _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); + _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); + _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); + _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); + _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); + _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); + _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); + _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); + _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); + _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); + } } void PfreqN4SecTranspose32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - //EB_U32 i; - // for (i = 0; i < 4; i++) - //i = 0; - { - __m256i a0, a1, a2, a3, a4, a5, a6, a7; - __m256i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */0)*src_stride)); - a1 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */1)*src_stride)); - a2 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */2)*src_stride)); - a3 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */3)*src_stride)); - a4 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */4)*src_stride)); - a5 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */5)*src_stride)); - a6 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */6)*src_stride)); - a7 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */7)*src_stride)); - - b0 = _mm256_unpacklo_epi16(a0, a4); - b1 = _mm256_unpacklo_epi16(a1, a5); - b2 = _mm256_unpacklo_epi16(a2, a6); - b3 = _mm256_unpacklo_epi16(a3, a7); - b4 = _mm256_unpackhi_epi16(a0, a4); - b5 = _mm256_unpackhi_epi16(a1, a5); - b6 = _mm256_unpackhi_epi16(a2, a6); - b7 = _mm256_unpackhi_epi16(a3, a7); - - a0 = _mm256_unpacklo_epi16(b0, b2); - a1 = _mm256_unpacklo_epi16(b1, b3); - a2 = _mm256_unpackhi_epi16(b0, b2); - a3 = _mm256_unpackhi_epi16(b1, b3); - a4 = _mm256_unpacklo_epi16(b4, b6); - a5 = _mm256_unpacklo_epi16(b5, b7); - a6 = _mm256_unpackhi_epi16(b4, b6); - a7 = _mm256_unpackhi_epi16(b5, b7); - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - b2 = _mm256_unpacklo_epi16(a2, a3); - b3 = _mm256_unpackhi_epi16(a2, a3); - b4 = _mm256_unpacklo_epi16(a4, a5); - b5 = _mm256_unpackhi_epi16(a4, a5); - b6 = _mm256_unpacklo_epi16(a6, a7); - b7 = _mm256_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 0)); - _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 0)); - _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b2, 0)); - _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b3, 0)); - _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b4, 0)); - _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b5, 0)); - _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b6, 0)); - _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b7, 0)); - _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 1)); - _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 1)); - _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b2, 1)); - _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b3, 1)); - _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b4, 1)); - _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b5, 1)); - _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b6, 1)); - _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b7, 1)); - } + //EB_U32 i; + // for (i = 0; i < 4; i++) + //i = 0; + { + __m256i a0, a1, a2, a3, a4, a5, a6, a7; + __m256i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */0)*src_stride)); + a1 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */1)*src_stride)); + a2 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */2)*src_stride)); + a3 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */3)*src_stride)); + a4 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */4)*src_stride)); + a5 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */5)*src_stride)); + a6 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */6)*src_stride)); + a7 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */7)*src_stride)); + + b0 = _mm256_unpacklo_epi16(a0, a4); + b1 = _mm256_unpacklo_epi16(a1, a5); + b2 = _mm256_unpacklo_epi16(a2, a6); + b3 = _mm256_unpacklo_epi16(a3, a7); + b4 = _mm256_unpackhi_epi16(a0, a4); + b5 = _mm256_unpackhi_epi16(a1, a5); + b6 = _mm256_unpackhi_epi16(a2, a6); + b7 = _mm256_unpackhi_epi16(a3, a7); + + a0 = _mm256_unpacklo_epi16(b0, b2); + a1 = _mm256_unpacklo_epi16(b1, b3); + a2 = _mm256_unpackhi_epi16(b0, b2); + a3 = _mm256_unpackhi_epi16(b1, b3); + a4 = _mm256_unpacklo_epi16(b4, b6); + a5 = _mm256_unpacklo_epi16(b5, b7); + a6 = _mm256_unpackhi_epi16(b4, b6); + a7 = _mm256_unpackhi_epi16(b5, b7); + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + b2 = _mm256_unpacklo_epi16(a2, a3); + b3 = _mm256_unpackhi_epi16(a2, a3); + b4 = _mm256_unpacklo_epi16(a4, a5); + b5 = _mm256_unpackhi_epi16(a4, a5); + b6 = _mm256_unpacklo_epi16(a6, a7); + b7 = _mm256_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 0)); + _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 0)); + _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b2, 0)); + _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b3, 0)); + _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b4, 0)); + _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b5, 0)); + _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b6, 0)); + _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b7, 0)); + _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 1)); + _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 1)); + _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b2, 1)); + _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b3, 1)); + _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b4, 1)); + _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b5, 1)); + _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b6, 1)); + _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b7, 1)); + } } void PfreqN4Transform32x32_AVX2_INTRIN( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) { - PfreqN41DTransform32_AVX2_INTRIN(src, src_stride, intermediate, 32, 6 + addshift); - PfreqN4FirstTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); - PfreqN42DTransform32_AVX2_INTRIN(dst, dst_stride, intermediate, 32, 9); - PfreqN4SecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); + PfreqN41DTransform32_AVX2_INTRIN(src, src_stride, intermediate, 32, 6 + addshift); + PfreqN4FirstTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); + PfreqN42DTransform32_AVX2_INTRIN(dst, dst_stride, intermediate, 32, 9); + PfreqN4SecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); - return; + return; } // forward 16x16 transform @@ -1475,286 +1475,286 @@ EB_EXTERN void lowPrecisionTransform32x32_AVX2_INTRIN(EB_S16 *src, EB_U32 src_st } void MatMult4x4_OutBuff_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32* nonzerocoeff) + EB_S16* coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32* nonzerocoeff) { - __m256i z = _mm256_setzero_si256(); - __m128i a, b; - __m256i coeffTemp, a0, a1, b0, b1, ymm_computed, MaskingMatrix, offsetREG, coeffTempORG; - (void)computeSize; + __m256i z = _mm256_setzero_si256(); + __m128i a, b; + __m256i coeffTemp, a0, a1, b0, b1, ymm_computed, MaskingMatrix, offsetREG, coeffTempORG; + (void)computeSize; - coeffTemp = a0 = a1 = b0 = b1 = ymm_computed = MaskingMatrix = offsetREG = _mm256_setzero_si256(); + coeffTemp = a0 = a1 = b0 = b1 = ymm_computed = MaskingMatrix = offsetREG = _mm256_setzero_si256(); - // prepare Shift REG - __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum); //_mm_set1_epi16((EB_U16)shiftNum);//_mm_set1_epi32(shiftNum); + // prepare Shift REG + __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum); //_mm_set1_epi16((EB_U16)shiftNum);//_mm_set1_epi32(shiftNum); - //prepare the offset - offsetREG = _mm256_set1_epi32(offset); + //prepare the offset + offsetREG = _mm256_set1_epi32(offset); - //load maskingMatrix_new - MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)maskingMatrix), _mm_loadl_epi64((__m128i*)(maskingMatrix + maskingMatrixStride)))), _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(maskingMatrix + 2 * maskingMatrixStride)), _mm_loadl_epi64((__m128i*)(maskingMatrix + 3 * maskingMatrixStride))), 0x1); + //load maskingMatrix_new + MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)maskingMatrix), _mm_loadl_epi64((__m128i*)(maskingMatrix + maskingMatrixStride)))), _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(maskingMatrix + 2 * maskingMatrixStride)), _mm_loadl_epi64((__m128i*)(maskingMatrix + 3 * maskingMatrixStride))), 0x1); - //load coefftemp - a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block - b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block - coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(a), b, 0x1); // the 4x4 block is now loaded + //load coefftemp + a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block + b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block + coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(a), b, 0x1); // the 4x4 block is now loaded - coeffTempORG = coeffTemp; - //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); + coeffTempORG = coeffTemp; + //Absolute val + coeffTemp = _mm256_abs_epi16(coeffTemp); - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); - a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); - b0 = _mm256_add_epi32(b0, offsetREG); - b1 = _mm256_add_epi32(b1, offsetREG); + b0 = _mm256_add_epi32(b0, offsetREG); + b1 = _mm256_add_epi32(b1, offsetREG); - //Shift right by PMP_PRECISION_REG - b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); - b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); + //Shift right by PMP_PRECISION_REG + b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); + b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - a = _mm256_extracti128_si256(ymm_computed, 0); - b = _mm256_extracti128_si256(ymm_computed, 1); - _mm_storel_epi64((__m128i *) coeffOut, a); - _mm_storel_epi64((__m128i *)(coeffOut + 1 * coeffOutStride), _mm_srli_si128(a, 8)); - _mm_storel_epi64((__m128i *)(coeffOut + 2 * coeffOutStride), b); - _mm_storel_epi64((__m128i *)(coeffOut + 3 * coeffOutStride), _mm_srli_si128(b, 8)); + a = _mm256_extracti128_si256(ymm_computed, 0); + b = _mm256_extracti128_si256(ymm_computed, 1); + _mm_storel_epi64((__m128i *) coeffOut, a); + _mm_storel_epi64((__m128i *)(coeffOut + 1 * coeffOutStride), _mm_srli_si128(a, 8)); + _mm_storel_epi64((__m128i *)(coeffOut + 2 * coeffOutStride), b); + _mm_storel_epi64((__m128i *)(coeffOut + 3 * coeffOutStride), _mm_srli_si128(b, 8)); - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); - *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); + *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); } /*****************************************************************************************************************************************************************/ void MatMult4x4_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, - const EB_U16 *maskingMatrix, + EB_S16* coeff, + const EB_U32 coeffStride, + const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff) + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff) { - __m256i z = _mm256_setzero_si256(); - __m128i a, b; - __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,offsetREG,coeffTempORG; + __m256i z = _mm256_setzero_si256(); + __m128i a, b; + __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,offsetREG,coeffTempORG; (void)computeSize; coeffTemp = a0 = a1 = b0 = b1 = ymm_computed = MaskingMatrix = offsetREG = _mm256_setzero_si256(); - - // prepare Shift REG + + // prepare Shift REG __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum); //_mm_set1_epi16((EB_U16)shiftNum);//_mm_set1_epi32(shiftNum); - - //prepare the offset - offsetREG = _mm256_set1_epi32(offset); - - //load maskingMatrix_new + + //prepare the offset + offsetREG = _mm256_set1_epi32(offset); + + //load maskingMatrix_new MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)maskingMatrix), _mm_loadl_epi64((__m128i*)(maskingMatrix + maskingMatrixStride)))), _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(maskingMatrix + 2 * maskingMatrixStride)), _mm_loadl_epi64((__m128i*)(maskingMatrix + 3 * maskingMatrixStride))), 0x1); - - //load coefftemp - a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block - b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block - coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256( a),b,0x1); // the 4x4 block is now loaded - - coeffTempORG = coeffTemp; + + //load coefftemp + a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block + b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block + coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256( a),b,0x1); // the 4x4 block is now loaded + + coeffTempORG = coeffTemp; //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); - - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + coeffTemp = _mm256_abs_epi16(coeffTemp); + + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - - - b0 = _mm256_unpacklo_epi16(a0, a1); + + + b0 = _mm256_unpacklo_epi16(a0, a1); b1 = _mm256_unpackhi_epi16(a0, a1); - - b0 = _mm256_add_epi32(b0, offsetREG); + + b0 = _mm256_add_epi32(b0, offsetREG); b1 = _mm256_add_epi32(b1, offsetREG); - - //Shift right by PMP_PRECISION_REG - b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); + + //Shift right by PMP_PRECISION_REG + b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - - a = _mm256_extracti128_si256(ymm_computed, 0); + + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + + a = _mm256_extracti128_si256(ymm_computed, 0); b = _mm256_extracti128_si256(ymm_computed, 1); _mm_storel_epi64((__m128i *)coeff, a); _mm_storel_epi64((__m128i *)(coeff + coeffStride), _mm_srli_si128(a, 8)); _mm_storel_epi64((__m128i *)(coeff + 2 * coeffStride), b); _mm_storel_epi64((__m128i *)(coeff + 3 * coeffStride), _mm_srli_si128(b, 8)); - - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); + + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); } /*******************************************MatMult8x8_AVX2_INTRIN**************************************************/ void MatMult8x8_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff) + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff) { - unsigned row; - __m256i z = _mm256_setzero_si256(); - //__m128i a, b; - __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; + unsigned row; + __m256i z = _mm256_setzero_si256(); + //__m128i a, b; + __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; coeffTemp = a0 = a1 = b0 = b1 = ymm_computed =MaskingMatrix= _mm256_setzero_si256(); - // prepare Shift REG + // prepare Shift REG __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum);//_mm_set1_epi32(shiftNum); - - //prepare the offset - __m256i offsetREG = _mm256_set1_epi32(offset); - row = 0; + + //prepare the offset + __m256i offsetREG = _mm256_set1_epi32(offset); + row = 0; do { - - //load maskingMatrix_new + + //load maskingMatrix_new MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(maskingMatrix + maskingMatrixStride*row))), _mm_loadu_si128((__m128i*)(maskingMatrix + maskingMatrixStride*(row + 1))), 0x1); - - //load coefftemp - coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(coeff + coeffStride*row))), + + //load coefftemp + coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(coeff + coeffStride*row))), _mm_loadu_si128((__m128i*)(coeff + coeffStride*(row + 1))), 0x1); - coeffTempORG = coeffTemp; + coeffTempORG = coeffTemp; //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); - - //Multiply - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + coeffTemp = _mm256_abs_epi16(coeffTemp); + + //Multiply + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - - - b0 = _mm256_unpacklo_epi16(a0, a1); + + + b0 = _mm256_unpacklo_epi16(a0, a1); b1 = _mm256_unpackhi_epi16(a0, a1); - - //Add - b0 = _mm256_add_epi32(b0, offsetREG); + + //Add + b0 = _mm256_add_epi32(b0, offsetREG); b1 = _mm256_add_epi32(b1, offsetREG); - - //Shift right by PMP_PRECISION_REG + + //Shift right by PMP_PRECISION_REG b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - - _mm_storeu_si128((__m128i *)(coeff + coeffStride*row), _mm256_extracti128_si256(ymm_computed, 0)); + + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + + _mm_storeu_si128((__m128i *)(coeff + coeffStride*row), _mm256_extracti128_si256(ymm_computed, 0)); _mm_storeu_si128((__m128i *)(coeff + coeffStride*(row + 1)), _mm256_extracti128_si256(ymm_computed, 1)); - - row += 2; + + row += 2; } while (row < computeSize); - - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); + + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); - + } /***************************************MatMultNxN_AVX2_INTRIN****************************************************/ void MatMultNxN_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff) + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff) { - - unsigned row,col; - __m256i z = _mm256_setzero_si256(); - //__m128i a, b; - __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; + + unsigned row,col; + __m256i z = _mm256_setzero_si256(); + //__m128i a, b; + __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; coeffTemp = a0 = a1 = b0 = b1 = ymm_computed =MaskingMatrix = _mm256_setzero_si256(); - - // prepare Shift REG + + // prepare Shift REG __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum);//_mm_set1_epi32(shiftNum); - - //prepare the offset - __m256i offsetREG = _mm256_set1_epi32(offset); - - row = 0; - do { - col = 0; - do { - - //load coefftemp - coeffTemp = _mm256_loadu_si256((__m256i *)(coeff + coeffStride*row + col)); - - //load maskingMatrix_new + + //prepare the offset + __m256i offsetREG = _mm256_set1_epi32(offset); + + row = 0; + do { + col = 0; + do { + + //load coefftemp + coeffTemp = _mm256_loadu_si256((__m256i *)(coeff + coeffStride*row + col)); + + //load maskingMatrix_new MaskingMatrix = _mm256_loadu_si256((__m256i *) (maskingMatrix + maskingMatrixStride*row + col)); - + coeffTempORG = coeffTemp; - - //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); - - //Multiply - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); - a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - - //Add - b0 = _mm256_add_epi32(b0, offsetREG); - b1 = _mm256_add_epi32(b1, offsetREG); - - //Shift right by PMP_PRECISION_REG - b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); - b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - - _mm256_storeu_si256((__m256i *)(coeff + coeffStride*row + col), ymm_computed); - - col += 16; + + //Absolute val + coeffTemp = _mm256_abs_epi16(coeffTemp); + + //Multiply + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); + + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + + //Add + b0 = _mm256_add_epi32(b0, offsetREG); + b1 = _mm256_add_epi32(b1, offsetREG); + + //Shift right by PMP_PRECISION_REG + b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); + b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); + + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + + _mm256_storeu_si256((__m256i *)(coeff + coeffStride*row + col), ymm_computed); + + col += 16; } while (col < computeSize); - row++; + row++; } while (row < computeSize); - - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); - *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); - + + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); + *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); + } diff --git a/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c index 066ec0f13..c38852fe1 100644 --- a/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c @@ -16,7 +16,7 @@ EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( EB_U32 lcuWidth) { reconStride -= lcuWidth ; - + EB_U32 width_cnt, height_cnt; EB_ERRORTYPE return_error = EB_ErrorNone; __m128i xmm_0 = _mm_setzero_si128(); @@ -34,7 +34,7 @@ EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( xmm_saoBandPosition = _mm_unpacklo_epi64(xmm_saoBandPosition, xmm_saoBandPosition); xmm_Offset0_3 = _mm_cvtsi32_si128(*(EB_S32*)saoOffsetPtr); - xmm_Offset0_3 = _mm_unpacklo_epi8(xmm_Offset0_3, xmm_Offset0_3); + xmm_Offset0_3 = _mm_unpacklo_epi8(xmm_Offset0_3, xmm_Offset0_3); xmm_Offset0_3 = _mm_unpacklo_epi16(xmm_Offset0_3, xmm_Offset0_3); xmm_Offset0_3_lo = _mm_unpacklo_epi32(xmm_Offset0_3, xmm_Offset0_3); xmm_Offset0_3_hi = _mm_unpackhi_epi32(xmm_Offset0_3, xmm_Offset0_3); @@ -49,7 +49,7 @@ EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( rec_0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); rec_8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - + //(boIndex < saoBandPosition || boIndex > saoBandPosition + SAO_BO_LEN - 1) ? 0 : saoOffsetPtr[boIndex - saoBandPosition] boIdx_sub_saoBandPosn = _mm_sub_epi8(_mm_packus_epi16(_mm_srli_epi16(rec_0_7, 5), _mm_srli_epi16(rec_8_15, 5)), xmm_saoBandPosition); cmp_result = _mm_and_si128(_mm_cmpeq_epi8(boIdx_sub_saoBandPosn, xmm_0), saoOffset0); @@ -99,7 +99,7 @@ EB_ERRORTYPE SAOApplyEO_90_16bit_SSE2_INTRIN( saoOffset3 = _mm_shuffle_epi32(saoOffset0_4, 0xff); for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + reconSamplePtrTemp = reconSamplePtr; tempBufUpper0_7 = _mm_loadu_si128((__m128i *)(temporalBufferUpper)); tempBufUpper8_15 = _mm_loadu_si128((__m128i *)(temporalBufferUpper + 8)); @@ -107,10 +107,10 @@ EB_ERRORTYPE SAOApplyEO_90_16bit_SSE2_INTRIN( recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtrTemp)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtrTemp + 8)); signTop = _mm_packs_epi16(_mm_sub_epi16(tempBufUpper0_7, recon0_7), _mm_sub_epi16(tempBufUpper8_15, recon8_15)); - + // -signTop - 1 nSignTop = _mm_sub_epi8(xmm_N2, _mm_add_epi8(_mm_cmpgt_epi8(signTop, xmm_0), _mm_cmpgt_epi8(signTop, xmm_N1))); - + for (height_cnt = 0; height_cnt < lcuHeight; ++height_cnt) { __m128i recon_s0_s7, recon_s8_s15, signBottom, nSignTotal, saoOffset_eo, sign, clipped_0_7, clipped_8_15; @@ -189,13 +189,13 @@ EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( signLeft = _mm_packs_epi16(_mm_sub_epi16(_mm_or_si128(_mm_slli_si128(recon0_7, 2), _mm_and_si128(tempBufferLeft, xmm_255)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 7)), recon8_15)); - + signRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 9)), recon8_15)); eoIndex = _mm_add_epi8(_mm_add_epi8(_mm_cmpgt_epi8(signLeft, xmm_0), _mm_cmpgt_epi8(signLeft, xmm_N1)), _mm_add_epi8(_mm_cmpgt_epi8(signRight, xmm_0), _mm_cmpgt_epi8(signRight, xmm_N1))); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_N4), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_N3), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_N1), saoOffset2), @@ -205,7 +205,7 @@ EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( clip3_0_7 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(recon0_7, _mm_unpacklo_epi8(saoOffset_eo, sign)), xmm_Max10bit), xmm_0); clip3_8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(recon8_15, _mm_unpackhi_epi8(saoOffset_eo, sign)), xmm_Max10bit), xmm_0); - + recon15_22 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 15)); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip3_0_7); @@ -223,7 +223,7 @@ EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( recon16_23 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon23_30 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 7)); recon24_31 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - + signLeft = _mm_packs_epi16(_mm_sub_epi16(recon15_22, recon16_23), _mm_sub_epi16(recon23_30, recon24_31)); signRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 1)), recon16_23), @@ -284,7 +284,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( saoOffset1 = _mm_shuffle_epi32(saoOffset0_4, 0x55); //1111111111111111 saoOffset2 = _mm_shuffle_epi32(saoOffset0_4, 0xaa); saoOffset3 = _mm_shuffle_epi32(saoOffset0_4, 0xff); - + // First row for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { @@ -299,7 +299,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( signBotRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 9)), recon8_15)); signBotRight = _mm_add_epi8(_mm_cmpgt_epi8(signBotRight, xmm_0), _mm_cmpgt_epi8(signBotRight, xmm_n1)); - + eoIndex = _mm_add_epi8(signTopLeft, signBotRight); _mm_storeu_si128((__m128i *)(signTLBuf + 1), signBotRight); // the next signTopLeft signTLBuf += 16; @@ -321,21 +321,21 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( EB_S32 count; signTLBuf -= lcuWidth; reconSamplePtr += reconStrideTemp; - + __m128i xmm_n2 = _mm_set1_epi8(-2); __m128i xmm_1 = _mm_set1_epi8(1); __m128i left; lcuHeight--; // Already written first row, total number for rows decrease by 1 lcuWidth -= 16; - + for (height_cnt = lcuHeight; height_cnt > 0 ; height_cnt -= 8) { //count backwards as it helps with the subsequence for loop's exit condition - + left = _mm_loadu_si128((__m128i *)(temporalBufferLeft)); temporalBufferLeft += 8; - + for (count = 0; count < (height_cnt == 7 ? 7 : 8); ++count) { - + recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); signTopLeft = _mm_sub_epi16(recon0_7, left); @@ -364,7 +364,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( reconSamplePtr += 16; for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + signTLBuf += 16; recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); @@ -388,7 +388,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( reconSamplePtr += 16; } signTLBuf -= lcuWidth; - reconSamplePtr += reconStrideTemp; + reconSamplePtr += reconStrideTemp; } } return EB_ErrorNone; @@ -405,12 +405,12 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( { EB_ALIGN(16) EB_S8 signTopRightTempBuffer[MAX_LCU_SIZE + 1]; EB_ALIGN(16) EB_S8 * signTopRightBufp = signTopRightTempBuffer; - + __m128i xmm_1, xmm_0, xmm_n1, xmm_n2, xmm_n3, xmm_n4, Max10bit, saoOffset0_7, saoOffset0_4, saoOffset0, saoOffset1, saoOffset2, saoOffset3; __m128i recon0_7, recon8_15, signBotLeft, signTopRight, eoIndex, sign, saoOffset_eo, clip0_7, clip8_15, xmm_temporalBufLeft, signBotLeft0, keep_lsb_mask; EB_U32 width_cnt; EB_S32 reconStrideTemp, height_cnt, count; - + xmm_0 = _mm_setzero_si128(); xmm_n1 = _mm_set1_epi8(-1); xmm_n3 = _mm_set1_epi8(-3); @@ -427,11 +427,11 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( saoOffset1 = _mm_shuffle_epi32(saoOffset0_4, 0x55); //1111111111111111 saoOffset2 = _mm_shuffle_epi32(saoOffset0_4, 0xaa); saoOffset3 = _mm_shuffle_epi32(saoOffset0_4, 0xff); - + //Seek to beginning of last row - + temporalBufferLeft += (lcuHeight - 7); - reconSamplePtr += (reconStride * (lcuHeight - 1)); + reconSamplePtr += (reconStride * (lcuHeight - 1)); lcuHeight -= 2; // First row and last row are done separately lcuWidth -= 16; // First col has different eoIndex calculation thus is not done in loop @@ -459,7 +459,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( eoIndex = _mm_add_epi8(signBotLeft, signTopRight); _mm_storeu_si128((__m128i *)(signTopRightBufp + 1), signTopRight); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n4), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n3), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n1), saoOffset2), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_0), saoOffset3))); @@ -468,13 +468,13 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - + reconSamplePtr += 16; for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + signTopRightBufp += 16; - + recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); @@ -490,7 +490,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( eoIndex = _mm_add_epi8(signBotLeft, signTopRight); _mm_storeu_si128((__m128i *)(signTopRightBufp + 1), signTopRight); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n4), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n3), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n1), saoOffset2), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_0), saoOffset3))); @@ -500,13 +500,13 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - reconSamplePtr += 16; + reconSamplePtr += 16; } reconStrideTemp = -1 *(reconStride) - lcuWidth - 16; signTopRightBufp -= lcuWidth; reconSamplePtr += reconStrideTemp; - + xmm_1 = _mm_set1_epi8(1); xmm_n2 = _mm_set1_epi8(-2); @@ -519,20 +519,20 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( recon0_7 = _mm_loadu_si128((__m128i *)reconSamplePtr); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - + signBotLeft = _mm_sub_epi16(recon0_7, _mm_srli_si128(xmm_temporalBufLeft, 14)); - + signBotLeft = _mm_and_si128(keep_lsb_mask, _mm_add_epi8(_mm_cmpgt_epi16(signBotLeft, xmm_0), _mm_cmpgt_epi16(signBotLeft, xmm_n1))); signBotLeft = _mm_or_si128(_mm_slli_si128(_mm_loadu_si128((__m128i *)(signTopRightBufp + 1)), 1), signBotLeft); - + signTopRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 9)), recon8_15)); - + signTopRight = _mm_add_epi8(_mm_cmpgt_epi8(signTopRight, xmm_0), _mm_cmpgt_epi8(signTopRight, xmm_n1)); - + eoIndex = _mm_sub_epi8(signBotLeft, signTopRight); - + signBotLeft = _mm_load_si128((__m128i *)(signTopRightBufp + 16)); // Variable is used in nested for loop below _mm_storeu_si128((__m128i *)(signTopRightBufp + 1), signTopRight); @@ -547,7 +547,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - + // Next iteration xmm_temporalBufLeft = _mm_slli_si128(xmm_temporalBufLeft, 2); reconSamplePtr += 16; @@ -562,11 +562,11 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( signTopRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 9)), recon8_15)); signTopRight = _mm_add_epi8(_mm_cmpgt_epi8(signTopRight, xmm_0), _mm_cmpgt_epi8(signTopRight, xmm_n1)); - + eoIndex = _mm_sub_epi8(signBotLeft, signTopRight); - + signBotLeft = _mm_load_si128((__m128i *)(signTopRightBufp + 16)); //Next iteration - + _mm_storeu_si128((__m128i*)(signTopRightBufp + 1), signTopRight); saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpgt_epi8(eoIndex, xmm_1), saoOffset0), @@ -578,11 +578,11 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - + reconSamplePtr += 16; } signTopRightBufp -= lcuWidth; - reconSamplePtr += reconStrideTemp; + reconSamplePtr += reconStrideTemp; } } @@ -591,7 +591,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - signBotLeft = _mm_sub_epi16(recon0_7, _mm_srli_si128(xmm_temporalBufLeft, 14)); + signBotLeft = _mm_sub_epi16(recon0_7, _mm_srli_si128(xmm_temporalBufLeft, 14)); xmm_temporalBufLeft = _mm_slli_si128(xmm_temporalBufLeft, 2); signBotLeft = _mm_and_si128(keep_lsb_mask, _mm_add_epi8(_mm_cmpgt_epi16(signBotLeft, xmm_0), _mm_cmpgt_epi16(signBotLeft, xmm_n1))); @@ -612,19 +612,19 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_1), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n1), saoOffset2), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n2), saoOffset3))); - + sign = _mm_cmpgt_epi8(xmm_0, saoOffset_eo); - + clip0_7 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpacklo_epi8(saoOffset_eo, sign), recon0_7 ), Max10bit), xmm_0); clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); - + _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); reconSamplePtr += 16; - + for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + signTopRightBufp += 16; recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); @@ -637,7 +637,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( eoIndex = _mm_sub_epi8(signBotLeft, signTopRight); signBotLeft = _mm_load_si128((__m128i *)(signTopRightBufp + 16)); //Used in the next iteration _mm_storeu_si128((__m128i*)(signTopRightBufp + 1), signTopRight); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpgt_epi8(eoIndex, xmm_1), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_1), saoOffset1)), diff --git a/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c index a79484f68..e0e5ed035 100644 --- a/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c @@ -26,307 +26,307 @@ void AvcStyleCopy_SSE2( //This function should be removed and replace by AvcStyleCopy_SSE2 void PictureAverageKernel_SSE2_INTRIN( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6, xmm_avg7, xmm_avg8; - EB_U32 y; - - if (areaWidth > 16) - { - if (areaWidth == 24) - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 32) - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 48) - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); - _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - - } - } - else - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); - - xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); - - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); - _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); - _mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - } - else - { - if (areaWidth == 16) - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); + __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6, xmm_avg7, xmm_avg8; + EB_U32 y; + + if (areaWidth > 16) + { + if (areaWidth == 24) + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 32) + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 48) + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); + _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + + } + } + else + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); + + xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); + + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); + _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); + _mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + } + else + { + if (areaWidth == 16) + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 4) - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); - - *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); - *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 8) - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); - - xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); - *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - } + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 4) + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); + + *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); + *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 8) + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); + + xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); + *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + } } void PictureAverageKernel1Line_SSE2_INTRIN( - EB_BYTE src0, - EB_BYTE src1, - EB_BYTE dst, - EB_U32 areaWidth) + EB_BYTE src0, + EB_BYTE src1, + EB_BYTE dst, + EB_U32 areaWidth) { - __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4; + __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4; - if (areaWidth > 16) - { - if (areaWidth == 32) - { - //for (y = 0; y < areaHeight; y += 2) + if (areaWidth > 16) + { + if (areaWidth == 32) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - //xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - //xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); - - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else - { - //for (y = 0; y < areaHeight; y += 2) + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + //xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + //xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); + + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); - - //xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - //xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - //xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - //xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); - - //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); - - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - } - else - { - if (areaWidth == 16) - { - //for (y = 0; y < areaHeight; y += 2) + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); + + //xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + //xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + //xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + //xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); + + //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); + + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + } + else + { + if (areaWidth == 16) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - //xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + //xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) dst, xmm_avg1); //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else if (areaWidth == 4) - { - //for (y = 0; y < areaHeight; y += 2) + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else if (areaWidth == 4) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); - //xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); + xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); + //xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); - *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); - //*(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); + *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); + //*(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else if (areaWidth == 8) - { - //for (y = 0; y < areaHeight; y += 2) + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else if (areaWidth == 8) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - //xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + //xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else - { - //for (y = 0; y < areaHeight; y += 2) + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); - //xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - //xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); + //xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + //xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); - //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); - //*(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); + //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); + //*(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - } + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + } } diff --git a/Source/Lib/ASM_SSE2/EbAvcStyleMcp_SSE2.h b/Source/Lib/ASM_SSE2/EbAvcStyleMcp_SSE2.h index eb05ebd18..009f82a64 100644 --- a/Source/Lib/ASM_SSE2/EbAvcStyleMcp_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbAvcStyleMcp_SSE2.h @@ -17,4 +17,4 @@ void AvcStyleCopy_SSE2(EB_BYTE refPic, EB_U32 srcStride, EB_BYTE dst, EB_U32 dst #ifdef __cplusplus } #endif -#endif //EBAVCSTYLEMCP_H \ No newline at end of file +#endif //EBAVCSTYLEMCP_H diff --git a/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c index 4916783d8..50b137b1f 100644 --- a/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c @@ -11,21 +11,21 @@ EB_U32 Compute4xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { EB_U32 y; (void)width; __m128i xmm_sad = _mm_setzero_si128(); for (y = 0; y < height; y+=4) { - + xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)src), _mm_cvtsi32_si128(*(EB_U32*)ref))); xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(src+srcStride)), _mm_cvtsi32_si128(*(EB_U32*)(ref+refStride)))); xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(src+(srcStride << 1))), _mm_cvtsi32_si128(*(EB_U32*)(ref+(refStride << 1))))); xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(src+3*srcStride)), _mm_cvtsi32_si128(*(EB_U32*)(ref+ 3*refStride)))); - + src += (srcStride << 2); ref += (refStride << 2); } @@ -36,14 +36,14 @@ EB_U32 Compute8xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { EB_U32 y; (void)width; __m128i xmm_sad = _mm_setzero_si128(); - + for (y = 0; y < height; y+=4) { xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8( _mm_loadl_epi64((__m128i*)src), _mm_loadl_epi64((__m128i*)ref))); @@ -62,21 +62,21 @@ EB_U32 Compute16xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { __m128i xmm_sad = _mm_setzero_si128(); EB_U32 y; (void)width; for (y = 0; y < height; y += 4) { - + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride << 1))), _mm_loadu_si128((__m128i*)(ref + (refStride << 1))))); xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 3*srcStride)), _mm_loadu_si128((__m128i*)(ref + 3*refStride)))); - + src += (srcStride << 2); ref += (refStride << 2); } @@ -90,9 +90,9 @@ EB_U32 Compute64xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { __m128i sad; (void)width; @@ -101,22 +101,22 @@ EB_U32 Compute64xMSad_SSE2_INTRIN( sad = _mm_setzero_si128(); for (y = 0; y < height; y+=4) { - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+16)), _mm_loadu_si128((__m128i*)(ref+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+32)), _mm_loadu_si128((__m128i*)(ref+32)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+48)), _mm_loadu_si128((__m128i*)(ref+48)))); - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride)), _mm_loadu_si128((__m128i*)(ref+refStride)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride+16)), _mm_loadu_si128((__m128i*)(ref+refStride+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride+32)), _mm_loadu_si128((__m128i*)(ref+refStride+32)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride+48)), _mm_loadu_si128((__m128i*)(ref+refStride+48)))); - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride)), _mm_loadu_si128((__m128i*)(ref+2*refStride)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+16)), _mm_loadu_si128((__m128i*)(ref+2*refStride+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+32)), _mm_loadu_si128((__m128i*)(ref+2*refStride+32)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+48)), _mm_loadu_si128((__m128i*)(ref+2*refStride+48)))); - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3 * srcStride )), _mm_loadu_si128((__m128i*)(ref+3 * refStride)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3 * srcStride +16)), _mm_loadu_si128((__m128i*)(ref+3 * refStride+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3 * srcStride +32)), _mm_loadu_si128((__m128i*)(ref+3 * refStride+32)))); @@ -125,7 +125,7 @@ EB_U32 Compute64xMSad_SSE2_INTRIN( src += 4 * srcStride; ref += 4 * refStride; } - + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); return _mm_cvtsi128_si32(sad); } @@ -141,21 +141,21 @@ EB_U32 CombinedAveraging4xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0,sad1; + __m128i sad0,sad1; EB_U32 y; - (void)width; + (void)width; sad0 = sad1 = _mm_setzero_si128(); - + for (y = 0; y < height; y+=2) { - + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src), _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)ref1), _mm_cvtsi32_si128(*(EB_U32 *)ref2)))); - + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src+srcStride)), _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(ref1+ref1Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(ref2+ref2Stride))))); src += srcStride << 1; ref1 += ref1Stride << 1; ref2 += ref2Stride << 1; } - return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); + return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); } @@ -169,22 +169,22 @@ EB_U32 CombinedAveraging8xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1; - EB_U32 y; - (void)width; + __m128i sad0, sad1; + EB_U32 y; + (void)width; - sad0 = sad1 = _mm_setzero_si128(); + sad0 = sad1 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { + for (y = 0; y < height; y += 2) { - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)src), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)ref1), _mm_loadl_epi64((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)src), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)ref1), _mm_loadl_epi64((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; - } - return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); + } + return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); } @@ -198,24 +198,24 @@ EB_U32 CombinedAveraging16xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad; - EB_U32 y; - (void)width; + __m128i sad0, sad1, sad; + EB_U32 y; + (void)width; - sad0 = sad1 = _mm_setzero_si128(); + sad0 = sad1 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { + for (y = 0; y < height; y += 2) { - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } - sad = _mm_add_epi32(sad0, sad1); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + sad = _mm_add_epi32(sad0, sad1); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } @@ -229,23 +229,23 @@ EB_U32 CombinedAveraging24xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad2, sad3, sad; - EB_U32 y; - (void)width; - sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { - - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + 16)), _mm_loadl_epi64((__m128i*)(ref2 + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride + 16))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } - sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + __m128i sad0, sad1, sad2, sad3, sad; + EB_U32 y; + (void)width; + sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); + for (y = 0; y < height; y += 2) { + + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + 16)), _mm_loadl_epi64((__m128i*)(ref2 + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride + 16))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } + sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } @@ -259,23 +259,23 @@ EB_U32 CombinedAveraging32xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad2, sad3, sad; - EB_U32 y; - (void)width; - sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { - - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } - sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + __m128i sad0, sad1, sad2, sad3, sad; + EB_U32 y; + (void)width; + sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); + for (y = 0; y < height; y += 2) { + + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } + sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } @@ -295,7 +295,7 @@ EB_U32 CombinedAveraging48xMSAD_SSE2_INTRIN( sad = _mm_setzero_si128(); - for (y = 0; y < height; y+=4) { + for (y = 0; y < height; y+=4) { sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1)), _mm_loadu_si128((__m128i*)(ref2))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+16)), _mm_loadu_si128((__m128i*)(ref2+16))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+32)), _mm_loadu_si128((__m128i*)(ref2+32))))); @@ -306,17 +306,17 @@ EB_U32 CombinedAveraging48xMSAD_SSE2_INTRIN( sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride+16)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride+16))))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride+32)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride+32))))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride+32)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride+32))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3*srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+3*ref1Stride)), _mm_loadu_si128((__m128i*)(ref2+3*ref2Stride))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3*srcStride+16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+3*ref1Stride+16)), _mm_loadu_si128((__m128i*)(ref2+3*ref2Stride+16))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3*srcStride+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+3*ref1Stride+32)), _mm_loadu_si128((__m128i*)(ref2+3*ref2Stride+32))))); - + src += (srcStride << 2); ref1 += (ref1Stride << 2); ref2 += (ref2Stride << 2); } - + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); return _mm_cvtsi128_si32(sad); } @@ -326,39 +326,39 @@ Compute32xMSad_SSE2_INTRIN **************************************************************************************************************/ EB_U32 Compute32xMSad_SSE2_INTRIN( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 height, - EB_U32 width) + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 height, + EB_U32 width) { - __m128i sad; - (void)width; - EB_U32 y; + __m128i sad; + (void)width; + EB_U32 y; - sad = _mm_setzero_si128(); + sad = _mm_setzero_si128(); - for (y = 0; y < height; y += 4) { + for (y = 0; y < height; y += 4) { - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_loadu_si128((__m128i*)(ref + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_loadu_si128((__m128i*)(ref + 16)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + refStride + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + refStride + 16)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride + 16)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3))), _mm_loadu_si128((__m128i*)(ref + (refStride * 3))))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3) + 16)), _mm_loadu_si128((__m128i*)(ref + (refStride * 3) + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3))), _mm_loadu_si128((__m128i*)(ref + (refStride * 3))))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3) + 16)), _mm_loadu_si128((__m128i*)(ref + (refStride * 3) + 16)))); - src += 4 * srcStride; - ref += 4 * refStride; - } + src += 4 * srcStride; + ref += 4 * refStride; + } - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } EB_U32 CombinedAveraging64xMSAD_SSE2_INTRIN( @@ -371,24 +371,24 @@ EB_U32 CombinedAveraging64xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad2, sad3, sad; - EB_U32 y; - (void)width; - sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 32)), _mm_loadu_si128((__m128i*)(ref2 + 32))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 48)), _mm_loadu_si128((__m128i*)(ref2 + 48))))); - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 32)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 32))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 48)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 48))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } - sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); -} \ No newline at end of file + __m128i sad0, sad1, sad2, sad3, sad; + EB_U32 y; + (void)width; + sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); + for (y = 0; y < height; y += 2) { + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 32)), _mm_loadu_si128((__m128i*)(ref2 + 32))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 48)), _mm_loadu_si128((__m128i*)(ref2 + 48))))); + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 32)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 32))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 48)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 48))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } + sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); +} diff --git a/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c index 5845c0efa..f927c234e 100644 --- a/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c @@ -8,71 +8,71 @@ #include "EbComputeMean_SSE2.h" EB_U64 ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride) // input parameter, input stride + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride) // input parameter, input stride { - __m128i xmm0, xmm_blockMean, xmm_input; + __m128i xmm0, xmm_blockMean, xmm_input; - xmm0 = _mm_setzero_si128(); - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)inputSamples), xmm0); - xmm_blockMean = _mm_madd_epi16(xmm_input, xmm_input); + xmm0 = _mm_setzero_si128(); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)inputSamples), xmm0); + xmm_blockMean = _mm_madd_epi16(xmm_input, xmm_input); - /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ + /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ + /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+4*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+4*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - //xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+5*inputStride)), xmm0); - //xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + //xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+5*inputStride)), xmm0); + //xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+6*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+6*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+7*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ + /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+7*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 8)); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 4)); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 8)); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 4)); - return (EB_U64)_mm_cvtsi128_si32(xmm_blockMean) << 11; + return (EB_U64)_mm_cvtsi128_si32(xmm_blockMean) << 11; + - } EB_U64 ComputeSubMean8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride) // input parameter, input stride + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride) // input parameter, input stride { - __m128i xmm0 = _mm_setzero_si128(), xmm1, xmm3, xmm_sum1, xmm_sum2; + __m128i xmm0 = _mm_setzero_si128(), xmm1, xmm3, xmm_sum1, xmm_sum2; - xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); - //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); - xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); - //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); - xmm_sum1 = _mm_add_epi16(xmm1,xmm3); + xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); + //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); + xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); + //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); + xmm_sum1 = _mm_add_epi16(xmm1,xmm3); - inputSamples += 4 * inputStride; - xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); - //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); - xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); - //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); - xmm_sum2 = _mm_add_epi16(xmm1, xmm3); - xmm_sum2 = _mm_add_epi16(xmm_sum1, xmm_sum2); + inputSamples += 4 * inputStride; + xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); + //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); + xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); + //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); + xmm_sum2 = _mm_add_epi16(xmm1, xmm3); + xmm_sum2 = _mm_add_epi16(xmm_sum1, xmm_sum2); - return (EB_U64)_mm_cvtsi128_si32(xmm_sum2) << 3; + return (EB_U64)_mm_cvtsi128_si32(xmm_sum2) << 3; } @@ -90,10 +90,10 @@ EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( xmm0 = _mm_setzero_si128(); xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)inputSamples), xmm0); xmm_blockMean = _mm_madd_epi16(xmm_input, xmm_input); - + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); @@ -108,12 +108,12 @@ EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+6*inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+7*inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 8)); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 4)); - + return (EB_U64)_mm_cvtsi128_si32(xmm_blockMean) << 10; } diff --git a/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h b/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h index 938f4c351..6bede6b28 100644 --- a/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h @@ -12,11 +12,11 @@ extern "C" { #include "EbDefinitions.h" EB_U64 ComputeSubMean8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride); EB_U64 ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride); EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( EB_U8 * inputSamples, // input parameter, input samples Ptr @@ -29,4 +29,4 @@ EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h b/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h index 08a8d3906..a7ca01ce9 100644 --- a/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h @@ -15,41 +15,41 @@ extern EB_U32 Compute4xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute8xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute16xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute32xMSad_SSE2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute64xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 CombinedAveraging4xMSAD_SSE2_INTRIN( EB_U8 *src, @@ -123,5 +123,5 @@ extern EB_U32 CombinedAveraging64xMSAD_SSE2_INTRIN( #ifdef __cplusplus } -#endif -#endif // EbComputeSAD_SSE2_h \ No newline at end of file +#endif +#endif // EbComputeSAD_SSE2_h diff --git a/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c index 613f4b0ce..f9373c6eb 100644 --- a/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c @@ -9,13 +9,13 @@ #include "EbDeblockingFilter_SSE2.h" void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, EB_U8 crTc) -{ +{ __m128i xmm_tcN = _mm_setzero_si128(); __m128i xmm0 = _mm_setzero_si128(); __m128i xmm_4 = _mm_set1_epi16(4); @@ -33,7 +33,7 @@ void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( xmm_p1 = _mm_unpacklo_epi32(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb - (reconChromaPicStride << 1))), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr - (reconChromaPicStride << 1)))); xmm_q0 = _mm_unpacklo_epi32(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr))); xmm_q1 = _mm_unpacklo_epi32(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb + reconChromaPicStride)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr + reconChromaPicStride))); - + xmm_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_slli_epi16(_mm_sub_epi16(xmm_q0, xmm_p0), 2), _mm_add_epi16(_mm_sub_epi16(xmm_p1, xmm_q1), xmm_4)), 3); xmm_delta = _mm_max_epi16(xmm_temp1, xmm_tcN); xmm_delta = _mm_min_epi16(xmm_delta, xmm_Tc); @@ -47,19 +47,19 @@ void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( *(EB_U32 *)(edgeStartSampleCr) = _mm_cvtsi128_si32(_mm_srli_si128(xmm_p0, 12)); } else { - xmm_p0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCb + reconChromaPicStride - 2))); - xmm_p0Cr = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCr - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr + reconChromaPicStride - 2))); - - xmm_q0 = _mm_unpackhi_epi32(xmm_p0, xmm_p0Cr); - xmm_p0 = _mm_unpacklo_epi32(xmm_p0, xmm_p0Cr); - xmm_p0 = _mm_unpacklo_epi64(_mm_srli_si128(xmm_p0, 8), xmm_p0); - - xmm_temp1 = _mm_sub_epi16(xmm_q0, xmm_p0); - xmm_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_sub_epi16(_mm_slli_epi16(xmm_temp1, 2), _mm_srli_si128(xmm_temp1, 8)), xmm_4), 3); + xmm_p0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCb + reconChromaPicStride - 2))); + xmm_p0Cr = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCr - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr + reconChromaPicStride - 2))); + + xmm_q0 = _mm_unpackhi_epi32(xmm_p0, xmm_p0Cr); + xmm_p0 = _mm_unpacklo_epi32(xmm_p0, xmm_p0Cr); + xmm_p0 = _mm_unpacklo_epi64(_mm_srli_si128(xmm_p0, 8), xmm_p0); + + xmm_temp1 = _mm_sub_epi16(xmm_q0, xmm_p0); + xmm_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_sub_epi16(_mm_slli_epi16(xmm_temp1, 2), _mm_srli_si128(xmm_temp1, 8)), xmm_4), 3); xmm_delta = _mm_min_epi16(_mm_max_epi16(xmm_temp1, xmm_tcN), xmm_Tc); - xmm_p0 = _mm_unpacklo_epi16(_mm_add_epi16(xmm_p0, xmm_delta), _mm_sub_epi16(xmm_q0, xmm_delta)); - xmm_p0 = _mm_max_epi16(_mm_min_epi16(xmm_p0, xmm_Max10bit), xmm0); + xmm_p0 = _mm_unpacklo_epi16(_mm_add_epi16(xmm_p0, xmm_delta), _mm_sub_epi16(xmm_q0, xmm_delta)); + xmm_p0 = _mm_max_epi16(_mm_min_epi16(xmm_p0, xmm_Max10bit), xmm0); *(EB_U32*)(edgeStartSampleCb-1) = _mm_cvtsi128_si32(xmm_p0); *(EB_U32*)(edgeStartSampleCb+reconChromaPicStride-1) = _mm_cvtsi128_si32(_mm_srli_si128(xmm_p0, 4)); diff --git a/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h b/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h index cae1d5741..3b8d421f8 100644 --- a/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h @@ -13,8 +13,8 @@ extern "C" { #endif extern void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, @@ -24,4 +24,4 @@ extern void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c index fc940f64f..03f22cac3 100644 --- a/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c @@ -142,9 +142,9 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( EB_ALIGN(16) EB_S8 rTemp[512] = { 0 }; EB_U64 reconStrideTemp; - lcuHeight -= 2; - inputSamplePtr += inputStride + 1; - reconSamplePtr++; + lcuHeight -= 2; + inputSamplePtr += inputStride + 1; + reconSamplePtr++; if (lcuWidth == 16) { @@ -175,7 +175,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( MACRO_CALC_EO_INDEX(reconSamplePtr+1, reconSamplePtr+2*reconStride-1) xmm_eoIndex = _mm_and_si128(xmm_eoIndex, xmm_skip_mask); // skip last 2 samples MACRO_GATHER_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3) - + inputSamplePtr += inputStride; reconSamplePtr += reconStride; } @@ -205,7 +205,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( // EO-45 MACRO_CALC_EO_INDEX(reconSamplePtr+1, reconSamplePtr+2*reconStride-1) MACRO_GATHER_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3) - + //----------- 16-25 ----------- xmm_temp_recon1 = _mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 16)); xmm_temp_recon2 = _mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 24)); @@ -267,7 +267,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( MACRO_GATHER_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3) inputSamplePtr += 16; - reconSamplePtr += 16; + reconSamplePtr += 16; } //----------- 48-53 ----------- xmm_temp_recon1 = _mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride)); @@ -366,6 +366,6 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( MACRO_SAVE_EO(OFFSET_EO_DIFF_1, OFFSET_EO_COUNT_1, 1) MACRO_SAVE_EO(OFFSET_EO_DIFF_2, OFFSET_EO_COUNT_2, 2) MACRO_SAVE_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3, 3) - + return return_error; } diff --git a/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_SSE2.asm b/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_SSE2.asm index 17c2e409f..c3ebf7483 100644 --- a/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_SSE2.asm +++ b/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_SSE2.asm @@ -1,7 +1,7 @@ -; +; ; Copyright(c) 2018 Intel Corporation ; SPDX - License - Identifier: BSD - 2 - Clause - Patent -; +; %include "x64inc.asm" %include "x64Macro.asm" diff --git a/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c index 1a397b84e..7bd6415e8 100644 --- a/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c @@ -91,7 +91,7 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( EB_U32 topLeftOffset = (size << 1); EB_U32 topOffset = ((size << 1) + 1); EB_U32 pStride = predictionBufferStride; - + if (size != 32) { __m128i xmm0 = _mm_setzero_si128(); __m128i xmm_mask1 = _mm_slli_si128( _mm_set1_epi16((signed char)(0xFFFF)), 2); @@ -104,24 +104,24 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( xmm_topLeft = _mm_unpacklo_epi32(xmm_topLeft, xmm_topLeft); xmm_topLeft_hi = _mm_unpackhi_epi64(xmm_topLeft, xmm_topLeft); xmm_topLeft_lo = _mm_unpacklo_epi64(xmm_topLeft, xmm_topLeft); - + if (!skip) { if (size ==16) { __m128i xmm_left_lo, xmm_left_hi, xmm_top_lo, xmm_top_hi; xmm_left_lo = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_topLeft_lo), 1), xmm_topLeft_hi); xmm_left_hi = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)), xmm_topLeft_lo), 1), xmm_topLeft_hi); - xmm_left_lo = _mm_max_epi16(_mm_min_epi16(xmm_left_lo, xmm_Max10bit), xmm0); - xmm_left_hi = _mm_max_epi16(_mm_min_epi16(xmm_left_hi, xmm_Max10bit), xmm0); + xmm_left_lo = _mm_max_epi16(_mm_min_epi16(xmm_left_lo, xmm_Max10bit), xmm0); + xmm_left_hi = _mm_max_epi16(_mm_min_epi16(xmm_left_hi, xmm_Max10bit), xmm0); xmm_top_hi = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); xmm_top_lo = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_16(xmm_left_lo, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) - predictionPtr += (pStride << 2); - MACRO_VERTICAL_LUMA_16(xmm_left_lo, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) - predictionPtr += (pStride << 2); - MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) - predictionPtr += (pStride << 2); - MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) + predictionPtr += (pStride << 2); + MACRO_VERTICAL_LUMA_16(xmm_left_lo, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) + predictionPtr += (pStride << 2); + MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) + predictionPtr += (pStride << 2); + MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) } else if (size == 8) { xmm_left = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_topLeft_lo), 1), xmm_topLeft_hi); @@ -147,7 +147,7 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( if (size == 16) { __m128i xmm_top_lo, xmm_top_hi; - + xmm_left = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_mask_skip), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)), xmm_mask_skip)); xmm_left = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_srai_epi16( _mm_sub_epi16(xmm_left, xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm_Max10bit), xmm0); xmm_top_hi = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); @@ -170,7 +170,7 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( __m128i top_16_23 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 16)); __m128i top_24_31 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 24)); EB_U64 count, size_to_write; - + pStride <<= (skip ? 1 : 0); // Each 2 storeu calls stores 32 bytes. Hence each iteration stores 8 * 32 bytes. @@ -281,62 +281,62 @@ void IntraModeVerticalChroma16bit_SSE2_INTRIN( if (!skip) { if (size == 16) { - __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - __m128i top_8_15 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + __m128i top_8_15 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); } else if (size == 8) { - __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)(predictionPtr), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)(predictionPtr), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); } else { - __m128i top_0_3 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); - _mm_storel_epi64((__m128i *)predictionPtr, top_0_3); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), top_0_3); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), top_0_3); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), top_0_3); + __m128i top_0_3 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); + _mm_storel_epi64((__m128i *)predictionPtr, top_0_3); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), top_0_3); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), top_0_3); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), top_0_3); } } else { @@ -386,14 +386,14 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip) //skip half rows -{ +{ EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; EB_U32 topOffset = (size << 1) + 1; EB_U32 topLeftOffset = size << 1; __m128i xmm_Max10bit = _mm_set1_epi16(0x03FF); __m128i xmm_0 = _mm_setzero_si128(); - + if (size != 32) { __m128i topLeft = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + topLeftOffset)); topLeft = _mm_unpacklo_epi16(topLeft, topLeft); @@ -413,12 +413,12 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left8_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset+8)); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -426,16 +426,16 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left89 = _mm_unpacklo_epi32(left8_11, left8_11); left10_11 = _mm_unpackhi_epi32(left8_11, left8_11); - - left0 = _mm_unpacklo_epi64(left01, left01); + + left0 = _mm_unpacklo_epi64(left01, left01); left1 = _mm_unpackhi_epi64(left01, left01); clip3_0_7 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(filter_cmpnt0_7, left0), xmm_Max10bit), xmm_0); clip3_8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(filter_cmpnt8_15, left0), xmm_Max10bit), xmm_0); - + left14_15 = _mm_unpackhi_epi32(left12_15, left12_15); left12_13 = _mm_unpacklo_epi32(left12_15, left12_15); - + _mm_storeu_si128((__m128i *)(predictionPtr), clip3_0_7); _mm_storeu_si128((__m128i *)(predictionPtr + 8), clip3_8_15); @@ -453,7 +453,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left13 = _mm_unpackhi_epi64(left12_13, left12_13); left14 = _mm_unpacklo_epi64(left14_15, left14_15); left15 = _mm_unpackhi_epi64(left14_15, left14_15); - + _mm_storeu_si128((__m128i *)(predictionPtr+pStride), left1); _mm_storeu_si128((__m128i *)(predictionPtr+pStride+8), left1); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), left2); @@ -495,12 +495,12 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); left67 = _mm_unpackhi_epi32(left4_7, left4_7); - + left0 = _mm_unpacklo_epi64(left01, left01); left1 = _mm_unpackhi_epi64(left01, left01); left2 = _mm_unpacklo_epi64(left23, left23); @@ -509,7 +509,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left5 = _mm_unpackhi_epi64(left45, left45); left6 = _mm_unpacklo_epi64(left67, left67); left7 = _mm_unpackhi_epi64(left67, left67); - + clipped_10bit = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(left0, filter_cmpnt), xmm_Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(predictionPtr), clipped_10bit); @@ -530,7 +530,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left23 = _mm_unpackhi_epi32(left0_3, left0_3); - left01 = _mm_unpacklo_epi32(left0_3, left0_3); + left01 = _mm_unpacklo_epi32(left0_3, left0_3); clipped_10bit = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(left01, filter_cmpnt), xmm_Max10bit), xmm_0); _mm_storel_epi64((__m128i *)(predictionPtr), clipped_10bit); @@ -551,9 +551,9 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( filter_cmpnt_0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), topLeft), 1); filter_cmpnt_8_15 = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset+8)), topLeft), 1); - left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask), + left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)), skip_mask)); - + left0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); left8_14_even = _mm_unpackhi_epi16(left0_14_even, left0_14_even); @@ -577,7 +577,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left10 = _mm_unpackhi_epi64(left8_10, left8_10); left12 = _mm_unpacklo_epi64(left12_14, left12_14); left14 = _mm_unpackhi_epi64(left12_14, left12_14); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), left2); _mm_storeu_si128((__m128i *)(predictionPtr + 2*pStride), left4); @@ -600,7 +600,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( __m128i left0_14_even, left_0_6_even, left02, left46; __m128i left0, left2, left4, left6; - filter_cmpnt = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), topLeft), 1); + filter_cmpnt = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), topLeft), 1); left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask), xmm_0); @@ -613,7 +613,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); - + clipped_10bit = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(left0, filter_cmpnt), xmm_Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(predictionPtr), clipped_10bit); @@ -630,17 +630,17 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( __m128i left0_7, left8_15, left0_3, left4_7, left8_11, left12_15, left01, left23, left45, left67, left89, left10_11; __m128i left12_13, left14_15, left0, left1, left2, left3, left4, left5, left6, left7, left8, left9, left10, left11; __m128i left12, left13, left14, left15; - + for (count = 0; count < 2; ++count) { left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left8_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)); refSamples += 16; - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -649,7 +649,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left10_11 = _mm_unpackhi_epi32(left8_11, left8_11); left12_13 = _mm_unpacklo_epi32(left12_15, left12_15); left14_15 = _mm_unpackhi_epi32(left12_15, left12_15); - + left0 = _mm_unpacklo_epi64(left01, left01); left1 = _mm_unpackhi_epi64(left01, left01); left2 = _mm_unpacklo_epi64(left23, left23); @@ -666,7 +666,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left13 = _mm_unpackhi_epi64(left12_13, left12_13); left14 = _mm_unpacklo_epi64(left14_15, left14_15); left15 = _mm_unpackhi_epi64(left14_15, left14_15); - + _mm_storeu_si128((__m128i *)(predictionPtr), left0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), left0); _mm_storeu_si128((__m128i *)(predictionPtr + 16), left0); @@ -880,12 +880,12 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left8_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left_01 = _mm_unpacklo_epi32(left0_3, left0_3); left_23 = _mm_unpackhi_epi32(left0_3, left0_3); left_45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -894,7 +894,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left_10_11 = _mm_unpackhi_epi32(left8_11, left8_11); left_12_13 = _mm_unpacklo_epi32(left12_15, left12_15); left_14_15 = _mm_unpackhi_epi32(left12_15, left12_15); - + left0 = _mm_unpacklo_epi64(left_01, left_01); left1 = _mm_unpackhi_epi64(left_01, left_01); left2 = _mm_unpacklo_epi64(left_23, left_23); @@ -911,7 +911,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left13 = _mm_unpackhi_epi64(left_12_13, left_12_13); left14 = _mm_unpacklo_epi64(left_14_15, left_14_15); left15 = _mm_unpackhi_epi64(left_14_15, left_14_15); - + _mm_storeu_si128((__m128i *)predictionPtr, left0); _mm_storeu_si128((__m128i *)(predictionPtr+8), left0); _mm_storeu_si128((__m128i *)(predictionPtr+pStride), left1); @@ -952,16 +952,16 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( __m128i left0, left1, left2, left3, left4, left5, left6, left7; __m128i left0_7, left0_3, left4_7, left_01, left_23, left_45, left_67; - left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); - + left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); - + left_01 = _mm_unpacklo_epi32(left0_3, left0_3); left_23 = _mm_unpackhi_epi32(left0_3, left0_3); left_45 = _mm_unpacklo_epi32(left4_7, left4_7); left_67 = _mm_unpackhi_epi32(left4_7, left4_7); - + left0 = _mm_unpacklo_epi64(left_01, left_01); left1 = _mm_unpackhi_epi64(left_01, left_01); left2 = _mm_unpacklo_epi64(left_23, left_23); @@ -970,7 +970,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left5 = _mm_unpackhi_epi64(left_45, left_45); left6 = _mm_unpacklo_epi64(left_67, left_67); left7 = _mm_unpackhi_epi64(left_67, left_67); - + _mm_storeu_si128((__m128i *)predictionPtr, left0); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left1); _mm_storeu_si128((__m128i *)(predictionPtr + 2*pStride), left2); @@ -982,10 +982,10 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3*pStride), left7); } else { - + __m128i left0_3, left01, left23; left0_3 = _mm_loadl_epi64((__m128i *)(refSamples + leftOffset)); - + left0_3 = _mm_unpacklo_epi16(left0_3, left0_3); left01 = _mm_unpacklo_epi32(left0_3, left0_3); @@ -1011,24 +1011,24 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( __m128i left0_14_even, left0_6_even, left8_14_even, left02, left46, left8_10, left12_14; __m128i left0, left2, left4, left6, left8, left10, left12, left14; - left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples+leftOffset)), skip_mask), + left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples+leftOffset)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples+leftOffset+8)), skip_mask)); left0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); left8_14_even = _mm_unpackhi_epi16(left0_14_even, left0_14_even); - + left02 = _mm_unpacklo_epi32(left0_6_even, left0_6_even); left46 = _mm_unpackhi_epi32(left0_6_even, left0_6_even); left8_10 = _mm_unpacklo_epi32(left8_14_even, left8_14_even); left12_14 = _mm_unpackhi_epi32(left8_14_even, left8_14_even); - + left0 = _mm_unpacklo_epi64(left02, left02); left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); left8 = _mm_unpacklo_epi64(left8_10, left8_10); left10 = _mm_unpackhi_epi64(left8_10, left8_10); - left12 = _mm_unpacklo_epi64(left12_14, left12_14); + left12 = _mm_unpacklo_epi64(left12_14, left12_14); left14 = _mm_unpackhi_epi64(left12_14, left12_14); _mm_storeu_si128((__m128i *)(predictionPtr), left0); @@ -1053,7 +1053,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( __m128i left0_14_even, left0_6_even, left02, left46, left0, left2, left4, left6; left0_14_even = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask); - left0_14_even = _mm_packs_epi32(left0_14_even, left0_14_even); + left0_14_even = _mm_packs_epi32(left0_14_even, left0_14_even); left0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); @@ -1064,7 +1064,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); - + _mm_storeu_si128((__m128i *)(predictionPtr), left0); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left2); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), left4); @@ -1080,7 +1080,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, left0); _mm_storel_epi64((__m128i *)(predictionPtr+pStride), _mm_srli_si128(left0, 8)); - } + } } } @@ -1090,7 +1090,7 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip) -{ +{ EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; @@ -1098,24 +1098,24 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( if (size == 32) { EB_U32 count; - - for (count = 0; count < 8; ++count) { - + + for (count = 0; count < 8; ++count) { + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 9))); _mm_storeu_si128((__m128i *)(predictionPtr + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 17))); - _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 25))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 25))); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 10))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 18))); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 26))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 26))); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 11))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 19))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 27))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 20))); @@ -1126,7 +1126,7 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( } else if (size == 16) { __m128i ref_9, ref_10, ref_11, ref_12, ref_13, ref_14, ref_15, ref_16; - + ref_9 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 9)); ref_10 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 10)); ref_11 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 11)); @@ -1138,26 +1138,26 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_9); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_10); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_11); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_12); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_13); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 6))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_14); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_15); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_16); predictionPtr += (pStride << 2); @@ -1167,29 +1167,29 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 18))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_11); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 19))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_12); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 20))); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_13); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 21))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_14); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 22))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_15); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 23))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_16); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 24))); } else if (size == 8) { - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); @@ -1211,7 +1211,7 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( if (size != 4) { pStride <<= 1; if (size == 32) { - + __m128i ref9, ref11, ref13, ref15, ref17, ref19, ref21, ref23, ref25, ref27, ref29, ref31, ref33, ref35, ref37, ref39; __m128i ref41, ref43, ref45, ref47; ref9 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 9)); @@ -1239,81 +1239,81 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref9); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref17); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref25); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref19); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref27); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref27); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref29); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref31); - + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, ref9); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref17); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref25); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref33); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref35); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref37); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref39); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref17); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref25); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref33); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref41); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref43); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref45); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref47); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref25); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref33); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref41); _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 49))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref43); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 51))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref45); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 53))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref47); @@ -1329,26 +1329,26 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref9); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref11); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref13); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref15); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref9); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 17))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 19))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 21))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 23))); } @@ -1373,7 +1373,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip) -{ +{ EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = (size << 1) + 1; @@ -1381,24 +1381,24 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( if (size == 32) { EB_U32 count; - - for (count = 0; count < 8; ++count) { - + + for (count = 0; count < 8; ++count) { + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 9))); _mm_storeu_si128((__m128i *)(predictionPtr + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 17))); _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 25))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 10))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 18))); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 26))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 26))); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 11))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 19))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 27))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 20))); @@ -1409,19 +1409,19 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( } else if (size == 16) { __m128i ref_9, ref_10, ref_11, ref_12, ref_13, ref_14, ref_15, ref_16; - + ref_9 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 9)); _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_9); - + ref_10 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 10)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_10); - + ref_11 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 11)); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_11); - + ref_12 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 12)); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_12); @@ -1438,7 +1438,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( ref_15 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 15)); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_15); - + ref_16 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 16)); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_16); @@ -1453,7 +1453,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_12); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 20))); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_13); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 21))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_14); @@ -1465,7 +1465,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( } else if (size == 8) { - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); @@ -1518,23 +1518,23 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_9); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref_17); - _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_25); - + _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_25); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref_19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref_27); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_29); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref_31); - + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, ref_9); @@ -1551,51 +1551,51 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_37); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref_39); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_17); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_25); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref_33); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_41); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref_35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref_43); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_45); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref_47); - + predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_25); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_33); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref_41); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_49); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref_43); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref_51); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_45); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_53); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_47); @@ -1619,7 +1619,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_15); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_9); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 17))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_11); @@ -1648,8 +1648,8 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( EB_U16 *refSamples, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) -{ + const EB_BOOL skip) +{ EB_U32 pStride = predictionBufferStride; EB_U32 topLeftOffset = (size << 1); @@ -1658,23 +1658,23 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( if (size == 32) { EB_U32 count; - for (count = 0; count < 8; ++count) { - + for (count = 0; count < 8; ++count) { + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset ))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 16))); _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 24))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 15))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 23))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 2))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 14))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 22))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 13))); @@ -1685,7 +1685,7 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( } else if (size == 16) { __m128i xmm_topLeft, xmm_topLeft_n1, xmm_topLeft_n2, xmm_topLeft_n3, xmm_topLeft_n4, xmm_topLeft_n5, xmm_topLeft_n6, xmm_topLeft_n7; - + xmm_topLeft = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset )); xmm_topLeft_n1 = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 1)); xmm_topLeft_n2 = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 2)); @@ -1696,18 +1696,18 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( xmm_topLeft_n7 = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 7)); _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n1); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n2); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n3); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 5))); predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_n4); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 4))); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n5); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n6); @@ -1727,7 +1727,7 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n3); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 13))); @@ -1792,8 +1792,8 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_8); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_16); - _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 24))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 24))); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_6); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_14); @@ -1803,24 +1803,24 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 20))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n6); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_2); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_10); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 18))); - + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_n8); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_8); _mm_storeu_si128((__m128i *)(predictionPtr + 24), xmm_topLeft_16); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_6); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), xmm_topLeft_14); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_4); @@ -1831,22 +1831,22 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_2); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), xmm_topLeft_10); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_n16); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_n8); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 24), xmm_topLeft_8); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n18); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), xmm_topLeft_6); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n20); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), xmm_topLeft_4); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n22); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n14); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_n6); @@ -1857,17 +1857,17 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_n16); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_n8); _mm_storeu_si128((__m128i *)(predictionPtr + 24), xmm_topLeft_0); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 26))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n18); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_n10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), xmm_topLeft_n2); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 28))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n20); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_n12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), xmm_topLeft_n4); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 30))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n22); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_n14); @@ -1883,27 +1883,27 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 4))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n6); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 2))); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_0); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 10))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n2); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n4); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 14))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n6); } @@ -1925,9 +1925,9 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle) + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle) { __m128i xmm_C32 = _mm_set1_epi16(0x0020); __m128i xmm_C16 = _mm_srli_epi16(xmm_C32, 1); @@ -1937,7 +1937,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( refSampMain += 1; if (!skip) { - + if (size == 32) { for (count = 0; count < 32; ++count) { @@ -1976,11 +1976,11 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); //(32 - deltaFract) - + //(((32 - deltaFract)*refSampMain[deltaInt + (EB_S32)colIndex] + deltaFract*refSampMain[deltaInt + (EB_S32)colIndex + 1] + 16) >> 5); pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); pred_8_15 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_8_15); predictionPtr += pStride; @@ -2000,7 +2000,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); predictionPtr += pStride; } @@ -2011,15 +2011,15 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( for (count = 0; count < 4; ++count){ deltaSum += intraPredAngle; deltaInt = deltaSum >> 5; - + deltaFract = _mm_cvtsi32_si128((deltaSum & 31)); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + pred_0_4 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + _mm_storel_epi64((__m128i *)predictionPtr, pred_0_4); predictionPtr += pStride; } @@ -2030,7 +2030,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( intraPredAngle <<= 1; if (size == 32) { - + for (count = 0; count < 16; ++count) { deltaInt = deltaSum >> 5; @@ -2068,7 +2068,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); pred_8_15 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_8_15); predictionPtr += (pStride << 1); @@ -2079,18 +2079,18 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( for (count = 0; count < 4; ++count) { deltaInt = deltaSum >> 5; - + deltaFract = _mm_cvtsi32_si128((deltaSum & 31)); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); - + predictionPtr += (pStride << 1); deltaSum += intraPredAngle; } @@ -2100,15 +2100,15 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( for (count = 0; count < 2; ++count) { deltaInt = deltaSum >> 5; - + deltaFract = _mm_cvtsi32_si128((deltaSum & 31)); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + pred_0_4 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt+1)), deltaFract), xmm_C16)), 5); - + _mm_storel_epi64((__m128i *)predictionPtr, pred_0_4); predictionPtr += (pStride << 1); deltaSum += intraPredAngle; @@ -2130,34 +2130,34 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( __m128i horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h; EB_U32 count, pStride = predictionBufferStride; EB_S32 deltaInt, deltaSum = 0; - + xmm_C32 = _mm_set1_epi16(0x0020); xmm_C16 = _mm_srli_epi16(xmm_C32, 1); refSampMain += 1; if (!skip) { - + if (size == 32) - { + { EB_S8 temp[0x800]; EB_U8 outer_counter; for (count = 0; count < 256; count += 8) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); //(32 - deltaFract) - + vertical_temp0 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); vertical_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); vertical_temp2 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 16)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 17)), deltaFract), xmm_C16)), 5); vertical_temp3 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 24)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 25)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp0); _mm_storeu_si128((__m128i *)(temp + 8 * count + 16), vertical_temp1); @@ -2165,13 +2165,13 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(temp + 8 * count + 48), vertical_temp3); } - EB_S8 * tempPtr = temp; + EB_S8 * tempPtr = temp; EB_U16 * predPtr = predictionPtr; - + for (outer_counter = 0; outer_counter < 2; ++outer_counter) { for (count = 0; count < 8; ++count) { - + horiz_0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x040))); horiz_1 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x080)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x0C0))); horiz_2 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x100)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x140))); @@ -2199,23 +2199,23 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( } } else if (size == 16) { - + EB_S8 temp[0x200]; for (count = 0; count < 64; count+=4) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp0 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); vertical_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp0); _mm_storeu_si128((__m128i *)(temp + 8 * count + 16), vertical_temp1); @@ -2253,16 +2253,16 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( for (count = 0; count < 16; count+=2) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp); } @@ -2274,7 +2274,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( horiz_5 = _mm_loadu_si128((__m128i *)(temp + 0x50)); horiz_6 = _mm_loadu_si128((__m128i *)(temp + 0x60)); horiz_7 = _mm_loadu_si128((__m128i *)(temp + 0x70)); - + //Unpack to re-arrange the packing to the horizontal packing MACRO_UNPACK(16, horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h) MACRO_UNPACK(32, horiz_0, horiz_2, horiz_01h, horiz_23h, horiz_4, horiz_6, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h) @@ -2297,25 +2297,25 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( for (count = 0; count < 4; ++count) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. temp[count] = _mm_cvtsi128_si64(vertical_temp); } //Unpack to re-arrange the packing to the horizontal packing horiz_0 = _mm_unpacklo_epi16(_mm_cvtsi64_si128(temp[0]), _mm_cvtsi64_si128(temp[1])); horiz_1 = _mm_unpacklo_epi16(_mm_cvtsi64_si128(temp[2]), _mm_cvtsi64_si128(temp[3])); - + pred_hi = _mm_unpackhi_epi32(horiz_0, horiz_1); pred_lo = _mm_unpacklo_epi32(horiz_0, horiz_1); - + _mm_storel_epi64((__m128i *)predictionPtr, pred_lo); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_srli_si128(pred_lo, 8)); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), pred_hi); @@ -2333,7 +2333,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( for (count = 0; count < 128; count += 4) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + refSamp_0_15 = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), skip_mask)); refSamp_1_16 = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), skip_mask)); refSamp16_31 = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 16)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 24)), skip_mask)); @@ -2343,9 +2343,9 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. vertical_temp0 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(refSamp_0_15, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(refSamp_1_16, deltaFract), xmm_C16)), 5); vertical_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(refSamp16_31, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(refSamp17_32, deltaFract), xmm_C16)), 5); @@ -2353,7 +2353,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp0); _mm_storeu_si128((__m128i *)(temp + 8 * count + 16), vertical_temp1); } - EB_S8 * tempPtr = temp; + EB_S8 * tempPtr = temp; EB_U16 * predPtr = predictionPtr; EB_U8 outer_counter; __m128i horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h;; @@ -2369,7 +2369,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( horiz_5 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x140)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x160))); horiz_6 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x180)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x1A0))); horiz_7 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x1C0)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x1E0))); - + //Unpack to re-arrange the packing to the horizontal packing MACRO_UNPACK(32, horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h) MACRO_UNPACK(64, horiz_0, horiz_2, horiz_01h, horiz_23h, horiz_4, horiz_6, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h) @@ -2391,7 +2391,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( else if (size == 16) { EB_S8 temp[0x100]; - + __m128i refSamp_0_15, refSamp_1_16; for (count = 0; count < 32; count+=2) { @@ -2406,9 +2406,9 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(refSamp_0_15, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(refSamp_1_16, deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp+8*count), vertical_temp); } @@ -2423,7 +2423,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( horiz_5 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xA0)), _mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xB0))); horiz_6 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xC0)), _mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xD0))); horiz_7 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xE0)), _mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xF0))); - + //Unpack to re-arrange the packing to the horizontal packing MACRO_UNPACK(32, horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h) MACRO_UNPACK(64, horiz_0, horiz_2, horiz_01h, horiz_23h, horiz_4, horiz_6, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h) @@ -2440,10 +2440,10 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( } } else if (size == 8) { - + EB_S8 temp[0x40]; __m128i temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, ref0, ref1; - + for (count = 0; count < 8; ++count) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); @@ -2457,38 +2457,38 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(ref0, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(ref1, deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storel_epi64((__m128i *)(temp+8*count), vertical_temp); } - + //Unpack to re-arrange the packing to the horizontal packing temp0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp)), _mm_loadl_epi64((__m128i *)(temp + 0x08))); temp1 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 0x10)), _mm_loadl_epi64((__m128i *)(temp + 0x18))); temp2 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 0x20)), _mm_loadl_epi64((__m128i *)(temp + 0x28))); temp3 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 0x30)), _mm_loadl_epi64((__m128i *)(temp + 0x38))); - + temp4 = _mm_unpacklo_epi32(temp0, temp1); temp5 = _mm_unpackhi_epi32(temp0, temp1); temp6 = _mm_unpacklo_epi32(temp2, temp3); - temp7 = _mm_unpackhi_epi32(temp2, temp3); - + temp7 = _mm_unpackhi_epi32(temp2, temp3); + _mm_storeu_si128((__m128i *)predictionPtr, _mm_unpacklo_epi64(temp4, temp6)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(temp4, temp6)); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_unpacklo_epi64(temp5, temp7)); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_unpackhi_epi64(temp5, temp7)); } else { - + for (count = 0; count < 4; ++count) { EB_U64 horiz; deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); @@ -2496,7 +2496,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_and_si128(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), skip_mask), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_and_si128(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt + 1)), skip_mask), deltaFract), xmm_C16)), 5); - + horiz = _mm_cvtsi128_si64(vertical_temp); *predictionPtr = (EB_U16)horiz; *(predictionPtr + pStride) = (EB_U16)(horiz >> 32); @@ -2504,4 +2504,4 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( } } } -} \ No newline at end of file +} diff --git a/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c index f7a4320cd..739ed3350 100644 --- a/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c @@ -101,19 +101,19 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 topOffset = (size << 1) + 1; EB_U32 topLeftOffset = (size << 1); EB_U32 leftOffset = 0; EB_U32 pStride = predictionBufferStride; - __m128i xmm_0, top, topLeft, filter_cmpnt0_7, unclipped, clipped; + __m128i xmm_0, top, topLeft, filter_cmpnt0_7, unclipped, clipped; __m128i left0_15, left0_7, left8_15, left0_3, left4_7, left8_11, left12_15, left01, left23, left45, left67, left89, left10_11; __m128i left12_13, left14_15, left0, left1, left2, left3, left4, left5, left6, left7, left8, left9, left10, left11; __m128i left12, left13, left14, left15; - - if (size != 32) { + + if (size != 32) { topLeft = _mm_cvtsi32_si128(*(refSamples + topLeftOffset)); xmm_0 = _mm_setzero_si128(); @@ -126,19 +126,19 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( if (size == 16) { __m128i filter_cmpnt8_15; - + top = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - + filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(top, xmm_0), topLeft), 1); filter_cmpnt8_15 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(top, xmm_0), topLeft), 1); left0_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left0_7 = _mm_unpacklo_epi8(left0_15, left0_15); left8_15 = _mm_unpackhi_epi8(left0_15, left0_15); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); - left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); - left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); + left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); + left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); left01 = _mm_unpacklo_epi32(left0_3, left0_3); @@ -149,10 +149,10 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( left10_11 = _mm_unpackhi_epi32(left8_11, left8_11); left12_13 = _mm_unpacklo_epi32(left12_15, left12_15); left14_15 = _mm_unpackhi_epi32(left12_15, left12_15); - - left0 = _mm_unpacklo_epi8(left01, xmm_0); + + left0 = _mm_unpacklo_epi8(left01, xmm_0); clipped = _mm_packus_epi16(_mm_add_epi16(left0, filter_cmpnt0_7), _mm_add_epi16(filter_cmpnt8_15, left0)); - + left1 = _mm_unpackhi_epi64(left01, left01); left2 = _mm_unpacklo_epi64(left23, left23); left3 = _mm_unpackhi_epi64(left23, left23); @@ -183,27 +183,27 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left9); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), left10); _mm_storeu_si128((__m128i *)(predictionPtr+3*pStride), left11); - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, left12); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left13); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), left14); _mm_storeu_si128((__m128i *)(predictionPtr+3*pStride), left15); } - else if (size == 8) { - + else if (size == 8) { + filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_0), topLeft), 1); left0_7 = _mm_loadl_epi64((__m128i *)(refSamples + leftOffset)); left0_7 = _mm_unpacklo_epi8(left0_7, left0_7); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); left67 = _mm_unpackhi_epi32(left4_7, left4_7); - + unclipped = _mm_add_epi16(_mm_unpacklo_epi8(left01, xmm_0), filter_cmpnt0_7); clipped = _mm_packus_epi16(unclipped, unclipped); @@ -217,55 +217,55 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), left67); _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_srli_si128(left67, 8)); - } else { + } else { __m128i filter_cmpnt0_3; - filter_cmpnt0_3 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_0), topLeft), 1); - - left0_3 = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)); + filter_cmpnt0_3 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_0), topLeft), 1); + + left0_3 = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)); left0_3 = _mm_unpacklo_epi8(left0_3, left0_3); //00112233 left0_3 = _mm_unpacklo_epi16(left0_3, left0_3); //0000111122223333 - - left01 = _mm_unpacklo_epi32(left0_3, left0_3); - left23 = _mm_unpackhi_epi32(left0_3, left0_3); - unclipped = _mm_add_epi16(_mm_unpacklo_epi8(left01, xmm_0), filter_cmpnt0_3); - clipped = _mm_packus_epi16(unclipped, unclipped); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); + left23 = _mm_unpackhi_epi32(left0_3, left0_3); + + unclipped = _mm_add_epi16(_mm_unpacklo_epi8(left01, xmm_0), filter_cmpnt0_3); + clipped = _mm_packus_epi16(unclipped, unclipped); + *(EB_U32*)predictionPtr = _mm_cvtsi128_si32(clipped); - *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left01, 8)); - *(EB_U32*)(predictionPtr + 2 * pStride) = _mm_cvtsi128_si32(left23); - *(EB_U32*)(predictionPtr + 3 * pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left23, 8)); + *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left01, 8)); + *(EB_U32*)(predictionPtr + 2 * pStride) = _mm_cvtsi128_si32(left23); + *(EB_U32*)(predictionPtr + 3 * pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left23, 8)); } } else { __m128i left0_14_even, left_0_6_even, left02, left46, skip_mask; - - skip_mask = _mm_set1_epi16(0x00FF); - pStride <<= 1; - + + skip_mask = _mm_set1_epi16(0x00FF); + pStride <<= 1; + if (size == 16) { __m128i filter_cmpnt8_15, left_8_14_even, left8_10, left12_14, left02_16wide; top = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(top, xmm_0), topLeft), 1); + filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(top, xmm_0), topLeft), 1); filter_cmpnt8_15 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(top, xmm_0), topLeft), 1); - + left0_14_even = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask); left0_14_even = _mm_packus_epi16(left0_14_even, left0_14_even); left0_14_even = _mm_unpacklo_epi8(left0_14_even, left0_14_even); left_0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); left_8_14_even = _mm_unpackhi_epi16(left0_14_even, left0_14_even); - + left02 = _mm_unpacklo_epi32(left_0_6_even, left_0_6_even); left46 = _mm_unpackhi_epi32(left_0_6_even, left_0_6_even); left8_10 = _mm_unpacklo_epi32(left_8_14_even, left_8_14_even); left12_14 = _mm_unpackhi_epi32(left_8_14_even, left_8_14_even); - + left02_16wide = _mm_unpacklo_epi8(left02, xmm_0); clipped = _mm_packus_epi16(_mm_add_epi16(left02_16wide, filter_cmpnt0_7), _mm_add_epi16(filter_cmpnt8_15, left02_16wide)); - + left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); @@ -283,16 +283,16 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left10); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), left12); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), left14); - + } else { filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_0), topLeft), 1); left_0_6_even = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), skip_mask); - left_0_6_even = _mm_packus_epi16(left_0_6_even, left_0_6_even); + left_0_6_even = _mm_packus_epi16(left_0_6_even, left_0_6_even); left_0_6_even = _mm_unpacklo_epi8(left_0_6_even, left_0_6_even); left_0_6_even = _mm_unpacklo_epi16(left_0_6_even, left_0_6_even); - + left02 = _mm_unpacklo_epi32(left_0_6_even, left_0_6_even); left46 = _mm_unpackhi_epi32(left_0_6_even, left_0_6_even); @@ -314,15 +314,15 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( for (count = 0; count < 2; ++count) { left0_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); refSamples += 16; - + left0_7 = _mm_unpacklo_epi8(left0_15, left0_15); left8_15 = _mm_unpackhi_epi8(left0_15, left0_15); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -404,13 +404,13 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; //Jing: //Add size == 32 for 444 - + __m128i left0_15, left0_7, left8_15, left0_3, left4_7, left8_11, left12_15, left01, left23, left45, left67, left89, left10_11; __m128i left12_13, left14_15, left0, left1, left2, left3, left4, left5, left6, left7, left8, left9, left10, left11; __m128i left12, left13, left14, left15; @@ -497,12 +497,12 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm0 = _mm_loadu_si128((__m128i *)(refSamples+leftOffset)); xmm8 = _mm_unpackhi_epi8(xmm0, xmm0); xmm0 = _mm_unpacklo_epi8(xmm0, xmm0); - + xmm4 = _mm_unpackhi_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); xmm12 = _mm_unpackhi_epi16(xmm8, xmm8); xmm8 = _mm_unpacklo_epi16(xmm8, xmm8); - + xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); xmm6 = _mm_unpackhi_epi32(xmm4, xmm4); @@ -511,7 +511,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm8 = _mm_unpacklo_epi32(xmm8, xmm8); xmm14 = _mm_unpackhi_epi32(xmm12, xmm12); xmm12 = _mm_unpacklo_epi32(xmm12, xmm12); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_unpacklo_epi64(xmm0, xmm0)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(xmm0, xmm0)); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), _mm_unpacklo_epi64(xmm2, xmm2)); @@ -526,7 +526,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(xmm8, xmm8)); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), _mm_unpacklo_epi64(xmm10, xmm10)); _mm_storeu_si128((__m128i *)(predictionPtr+3*pStride), _mm_unpackhi_epi64(xmm10, xmm10)); - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, _mm_unpacklo_epi64(xmm12, xmm12)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(xmm12, xmm12)); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), _mm_unpacklo_epi64(xmm14, xmm14)); @@ -538,12 +538,12 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm0 = _mm_unpacklo_epi8(xmm0, xmm0); xmm4 = _mm_unpackhi_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); - + xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); xmm6 = _mm_unpackhi_epi32(xmm4, xmm4); xmm4 = _mm_unpacklo_epi32(xmm4, xmm4); - + _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); _mm_storel_epi64((__m128i *)(predictionPtr+pStride), _mm_srli_si128(xmm0, 8)); _mm_storel_epi64((__m128i *)(predictionPtr+2*pStride), xmm2); @@ -576,13 +576,13 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( MACRO_HORIZONTAL_LUMA_32X16(16) } else if (size == 16) { __m128i xmm0, xmm2, xmm4, xmm6; - + xmm0 = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm15); xmm0 = _mm_packus_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi8(xmm0, xmm0); xmm4 = _mm_unpackhi_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); - + xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); xmm6 = _mm_unpackhi_epi32(xmm4, xmm4); @@ -607,7 +607,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); - + _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_srli_si128(xmm0, 8)); _mm_storel_epi64((__m128i *)(predictionPtr + 2*pStride), xmm2); @@ -622,7 +622,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( *(EB_U32*)(predictionPtr) = _mm_cvtsi128_si32(xmm0); *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_srli_si128(xmm0, 4)); - } + } } } @@ -645,7 +645,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( if (size != 4) { __m128i xmm_TopRight, xmm_BottomLeft; __m128i pred_0, pred_1, pred_2, pred_3; - + xmm_TopRight = _mm_cvtsi32_si128((EB_U32)*(refSamples + topRightOffset)); xmm_TopRight = _mm_unpacklo_epi16(xmm_TopRight, xmm_TopRight); xmm_TopRight = _mm_unpacklo_epi32(xmm_TopRight, xmm_TopRight); @@ -654,7 +654,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( xmm_BottomLeft = _mm_unpacklo_epi16(xmm_BottomLeft, xmm_BottomLeft); xmm_BottomLeft = _mm_unpacklo_epi32(xmm_BottomLeft, xmm_BottomLeft); xmm_BottomLeft = _mm_unpacklo_epi64(xmm_BottomLeft, xmm_BottomLeft); - + if (size == 32) { __m128i xmm_ref, xmm_ref16; __m128i xmm_topRightAddSize0, xmm_topRightAddSize1, xmm_topRightAddSize2, xmm_topRightAddSize3, xmm_top0, xmm_top1, xmm_top2, xmm_top3; @@ -673,36 +673,36 @@ void IntraModePlanar16bit_SSE2_INTRIN( refSamples += leftOffset; if (!skip) { - EB_U32 count1; - + EB_U32 count1; + // The coefficients will be size-1, size-2, ... so we start at 31, 30, ... and reverse towards 0 for (reverseCnt = 8; reverseCnt > 0; reverseCnt -= 2) { - + bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + 4 * reverseCnt + OFFSET_1TO8 - 32))); - + xmm_ref = _mm_loadu_si128((__m128i *)(refSamples)); refSamples += 8; for (count1 = 0; count1 < 8; ++count1) { - + xmm_ref16 = _mm_unpacklo_epi16(xmm_ref, xmm_ref); xmm_ref16 = _mm_unpacklo_epi32(xmm_ref16, xmm_ref16); xmm_ref16 = _mm_unpacklo_epi64(xmm_ref16, xmm_ref16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_31TO24))), xmm_topRightAddSize0), bottomLeftTotal16), _mm_mullo_epi16(xmm_top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_23TO16))), xmm_topRightAddSize1), bottomLeftTotal16), _mm_mullo_epi16(xmm_top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); pred_2 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_15TO8))), xmm_topRightAddSize2), bottomLeftTotal16), _mm_mullo_epi16(xmm_top2, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); pred_3 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_7TO0))), xmm_topRightAddSize3), bottomLeftTotal16), _mm_mullo_epi16(xmm_top3, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); - + _mm_storeu_si128((__m128i *)(predictionPtr), pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); _mm_storeu_si128((__m128i *)(predictionPtr + 16), pred_2); _mm_storeu_si128((__m128i *)(predictionPtr + 24), pred_3); - + // For next iteration coefOffset -= 8; predictionPtr += pStride; @@ -715,25 +715,25 @@ void IntraModePlanar16bit_SSE2_INTRIN( for (reverseCnt = 4; reverseCnt > 0; reverseCnt -= 2) { bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + 4 * reverseCnt + OFFSET_1TO15 - 16))); - xmm_ref = _mm_packs_epi32(_mm_srli_epi32(_mm_slli_epi32(_mm_loadu_si128((__m128i *)(refSamples)), 16), 16), + xmm_ref = _mm_packs_epi32(_mm_srli_epi32(_mm_slli_epi32(_mm_loadu_si128((__m128i *)(refSamples)), 16), 16), _mm_srli_epi32(_mm_slli_epi32(_mm_loadu_si128((__m128i *)(refSamples + 8)), 16), 16)); refSamples += 16; for (count = 0; count < 8; ++count) { - + xmm_ref16 = _mm_unpacklo_epi16(xmm_ref, xmm_ref); xmm_ref16 = _mm_unpacklo_epi32(xmm_ref16, xmm_ref16); xmm_ref16 = _mm_unpacklo_epi64(xmm_ref16, xmm_ref16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_31TO24))), xmm_topRightAddSize0), bottomLeftTotal16), _mm_mullo_epi16(xmm_top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_23TO16))), xmm_topRightAddSize1), bottomLeftTotal16), _mm_mullo_epi16(xmm_top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); pred_2 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_15TO8))), xmm_topRightAddSize2), bottomLeftTotal16), _mm_mullo_epi16(xmm_top2, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); pred_3 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_7TO0))), xmm_topRightAddSize3), bottomLeftTotal16), _mm_mullo_epi16(xmm_top3, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); - + _mm_storeu_si128((__m128i *)(predictionPtr), pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); _mm_storeu_si128((__m128i *)(predictionPtr + 16), pred_2); @@ -752,7 +752,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( __m128i topRightTotal0, topRightTotal1, top0, top1, left1, bottomLeftTotal1, leftCoeff0, leftCoeff1; coefOffset = OFFSET_15; // The coefficients will be size-1, size-2, ... so we start at 15, 14, ... and reverse towards 0 - + topRightTotal0 = _mm_add_epi16(_mm_mullo_epi16(xmm_TopRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_16))); topRightTotal1 = _mm_add_epi16(_mm_mullo_epi16(xmm_TopRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_9TO16))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_16))); top0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); @@ -776,14 +776,14 @@ void IntraModePlanar16bit_SSE2_INTRIN( bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff0), topRightTotal0), bottomLeftTotal16), _mm_mullo_epi16(top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff1), topRightTotal1), bottomLeftTotal16), _mm_mullo_epi16(top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); _mm_storeu_si128((__m128i *)predictionPtr, pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); - + // Next iteration coefOffset -= 8; predictionPtr += pStride; @@ -795,22 +795,22 @@ void IntraModePlanar16bit_SSE2_INTRIN( } } else { - bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO15))); + bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO15))); left = _mm_packs_epi32(_mm_srli_epi32(_mm_slli_epi32(left, 16), 16), _mm_srli_epi32(_mm_slli_epi32(left1, 16), 16)); for (count = 0; count < 8; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); - left16 = _mm_unpacklo_epi64(left16, left16); - + left16 = _mm_unpacklo_epi64(left16, left16); + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff0), topRightTotal0), bottomLeftTotal16), _mm_mullo_epi16(top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff1), topRightTotal1), bottomLeftTotal16), _mm_mullo_epi16(top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); @@ -823,25 +823,25 @@ void IntraModePlanar16bit_SSE2_INTRIN( } } else { - + topRightAddSize = _mm_add_epi16(_mm_mullo_epi16(xmm_TopRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_8))); top = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); left = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); leftCoeff = _mm_load_si128((__m128i *)(coeffArray + OFFSET_7TO0)); if (!skip) { - + bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))); for (count = 0; count < 8; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); left16 = _mm_unpacklo_epi64(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + pred = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff), topRightAddSize), bottomLeftTotal16), _mm_mullo_epi16(top, _mm_load_si128((__m128i *)(coeffArray + OFFSET_7)))), 4); _mm_storeu_si128((__m128i *)(predictionPtr), pred); @@ -850,18 +850,18 @@ void IntraModePlanar16bit_SSE2_INTRIN( predictionPtr += pStride; left = _mm_srli_si128(left, 2); bottomLeftTotal = _mm_srli_si128(bottomLeftTotal, 2); - } - } + } + } else { bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO15))); left = _mm_srli_epi32(_mm_slli_epi32(left, 16), 16); for (count = 0; count < 4; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); left16 = _mm_unpacklo_epi64(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); @@ -879,7 +879,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( } } else { - + topRight = _mm_cvtsi32_si128((EB_U32)*(refSamples + topRightOffset)); topRight = _mm_unpacklo_epi16(topRight, topRight); topRight = _mm_unpacklo_epi32(topRight, topRight); @@ -887,21 +887,21 @@ void IntraModePlanar16bit_SSE2_INTRIN( bottomLeft = _mm_cvtsi32_si128((EB_U32)*(refSamples + bottomLeftOffset)); bottomLeft = _mm_unpacklo_epi16(bottomLeft, bottomLeft); bottomLeft = _mm_unpacklo_epi32(bottomLeft, bottomLeft); - + topRightAddSize = _mm_add_epi16(_mm_mullo_epi16(topRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_4))); - + top = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); left = _mm_loadl_epi64((__m128i *)(refSamples + leftOffset)); leftCoeff = _mm_loadl_epi64((__m128i *)(coeffArray + OFFSET_3TO0)); if (!skip) { bottomLeftTotal = _mm_mullo_epi16(bottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))); - + for (count = 0; count < 4; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); @@ -920,13 +920,13 @@ void IntraModePlanar16bit_SSE2_INTRIN( left = _mm_srli_epi32(_mm_slli_epi32(left, 16), 16); for (count = 0; count < 2; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - + pred = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff), topRightAddSize), bottomLeftTotal16), _mm_mullo_epi16(top, _mm_load_si128((__m128i *)(coeffArray + OFFSET_3)))), 3); _mm_storel_epi64((__m128i *)predictionPtr, pred); diff --git a/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h b/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h index 726b6a433..52950eddc 100644 --- a/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h @@ -37,7 +37,7 @@ extern void IntraModeHorizontalLuma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeHorizontalLuma16bit_SSE2_INTRIN( @@ -52,7 +52,7 @@ extern void IntraModeHorizontalChroma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); extern void IntraModeHorizontalChroma16bit_SSE2_INTRIN( @@ -94,9 +94,9 @@ extern void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( EB_U32 size, //input parameter, denotes the size of the current PU diff --git a/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c index 3b29ad1ca..913dc512c 100644 --- a/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c @@ -247,9 +247,9 @@ void InvTransform4x4_SSE2_INTRIN( xmm_trans_2_4 = _mm_unpackhi_epi16(xmm0, xmm2); xmm_offset = _mm_srli_epi32(_mm_set1_epi32(0x0800), bitIncrement); - + MACRO_4x4(sra_epi32, xmm_shift) - + xmm_res_3_4 = _mm_unpackhi_epi16(xmm_res_1_3, xmm_res_2_4); xmm_res_1_2 = _mm_unpacklo_epi16(xmm_res_1_3, xmm_res_2_4); xmm_res_1_2_3_4_hi = _mm_unpackhi_epi32(xmm_res_1_2, xmm_res_3_4); @@ -285,7 +285,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_odd_hi = _mm_load_si128((__m128i *)(transformInnerArrayPtrAligned + OFFSET + 8));\ XMM_RES1 = _mm_packs_epi32(_mm_##SHIFT_INSTR(_mm_add_epi32(XMM_EVEN_LO, xmm_odd_lo), SHIFT), _mm_##SHIFT_INSTR(_mm_add_epi32(XMM_EVEN_HI, xmm_odd_hi), SHIFT));\ XMM_RES2 = _mm_packs_epi32(_mm_##SHIFT_INSTR(_mm_sub_epi32(XMM_EVEN_LO, xmm_odd_lo), SHIFT), _mm_##SHIFT_INSTR(_mm_sub_epi32(XMM_EVEN_HI, xmm_odd_hi), SHIFT)); - + EB_ALIGN(16) EB_S16 * transformInnerArrayPtrAligned = transformInnerArrayPtr; __m128i xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans4, xmm_trans_1_3_hi, xmm_trans_1_3_lo, xmm_trans_2_4_hi, xmm_trans_2_4_lo; @@ -306,7 +306,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_trans_1_3_lo = _mm_unpacklo_epi16(xmm_trans1, xmm_trans3); xmm_trans_2_4_hi = _mm_unpackhi_epi16(xmm_trans2, xmm_trans4); xmm_trans_2_4_lo = _mm_unpacklo_epi16(xmm_trans2, xmm_trans4); - + //Odd0 xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_89_50)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_18)); @@ -316,17 +316,17 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_N89)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N18_N50)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x10) - + //Odd2 xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_50_18)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N89_75)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x20) - + //Odd3 xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_18_75)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N50_N89)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x30) - + // Even transform coefficients (0,2,4,6) transformCoefficients -= srcStride; xmm_trans1 = _mm_loadu_si128((__m128i *)(transformCoefficients)); @@ -342,7 +342,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_64)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_N64)); xmm_offset = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64)); - + xmm_evenEven0L = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_lo, xmm_DCT1), xmm_offset); xmm_evenEven0H = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_hi, xmm_DCT1), xmm_offset); @@ -351,7 +351,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_83_36)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_36_N83)); - + xmm_evenOdd0L = _mm_madd_epi16(xmm_trans_2_4_lo, xmm_DCT1); xmm_evenOdd0H = _mm_madd_epi16(xmm_trans_2_4_hi, xmm_DCT1); xmm_evenOdd1L = _mm_madd_epi16(xmm_trans_2_4_lo, xmm_DCT2); @@ -381,7 +381,7 @@ void InvTransform8x8_SSE2_INTRIN( _mm_store_si128((__m128i *)(transformInnerArrayPtrAligned + 0x48), xmm_res02_hi); _mm_store_si128((__m128i *)(transformInnerArrayPtrAligned + 0x50), xmm_res01_hi); _mm_store_si128((__m128i *)(transformInnerArrayPtrAligned + 0x58), xmm_res13_hi); - + // Odd transform coefficients from transformArrayPtr (high results from MACRO_UNPACK) xmm_trans_1_3_lo = _mm_unpacklo_epi16(xmm_res04_hi, xmm_res15_hi); xmm_trans_1_3_hi = _mm_unpackhi_epi16(xmm_res04_hi, xmm_res15_hi); @@ -390,22 +390,22 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_89_50)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_18)); - + MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0) xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_N89)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N18_N50)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x10) - + xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_50_18)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N89_75)); - + MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x20) xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_18_75)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N50_N89)); - + MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x30) // Load even transform coefficients from transformArrayPtr @@ -421,8 +421,8 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_64)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_N64)); - xmm_offset = _mm_srli_epi32(_mm_set1_epi32(0x0800), bitIncrement); - + xmm_offset = _mm_srli_epi32(_mm_set1_epi32(0x0800), bitIncrement); + xmm_evenEven0L = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_lo, xmm_DCT1), xmm_offset); xmm_evenEven0H = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_hi, xmm_DCT1), xmm_offset); @@ -522,13 +522,13 @@ void InvDstTransform4x4_SSE2_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(InvDstTransformAsmConst_SSE2 + OFFSET_DST_64)); MACRO_DST_4X4(srai_epi32, 7) - + xmm_trans_1_3 = _mm_unpacklo_epi16(xmm_res_lo_32, xmm_res_hi_32); xmm_trans_2_4 = _mm_unpackhi_epi16(xmm_res_lo_32, xmm_res_hi_32); - + xmm_offset = _mm_srli_epi32(_mm_sll_epi32(xmm_offset, xmm_shift), 7); MACRO_DST_4X4(sra_epi32, xmm_shift) - + _mm_storel_epi64((__m128i *)(residual), xmm_res_lo_32); xmm_res_lo_32 = _mm_srli_si128(xmm_res_lo_32, 8); _mm_storel_epi64((__m128i *)(residual + dstStride), xmm_res_lo_32); @@ -537,4 +537,4 @@ void InvDstTransform4x4_SSE2_INTRIN( _mm_storel_epi64((__m128i *)(residual + 3 * dstStride), xmm_res_hi_32); (void)transformInnerArrayPtr; -} \ No newline at end of file +} diff --git a/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c index ec241a346..8d556fa71 100644 --- a/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c @@ -36,12 +36,12 @@ void PictureCopyKernelOutRaw16bit_SSE2_INTRIN( EB_S16 *dst, EB_U32 puWidth, EB_U32 puHeight) -{ +{ EB_U32 rowCount, colCount; __m128i a0, a1, a2, a3; //PrefetchBlock(refPic, srcStride, puWidth, puHeight); - + if (puWidth & 2) { EB_U16 *ptr = refPic; rowCount = puHeight; @@ -56,20 +56,20 @@ void PictureCopyKernelOutRaw16bit_SSE2_INTRIN( a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); _mm_storeu_si128((__m128i *)dst, a0); - + dst += 8; rowCount -= 4; } while (rowCount != 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + refPic += 2; } - + if (puWidth & 4) { EB_U16 *ptr = refPic; rowCount = puHeight; @@ -81,20 +81,20 @@ void PictureCopyKernelOutRaw16bit_SSE2_INTRIN( a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); _mm_storeu_si128((__m128i *)dst, a0); - + dst += 8; rowCount -= 2; } while (rowCount != 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - + colCount = puWidth; do { __m128i a0; @@ -108,7 +108,7 @@ void PictureCopyKernelOutRaw16bit_SSE2_INTRIN( dst += 8; } while (--rowCount != 0); - + colCount -= 8; refPic += 8; } @@ -1972,9 +1972,9 @@ void LumaInterpolationFilterPosnOutRaw16bit_SSE2_INTRIN( void ChromaInterpolationFilterOneD16bitHorizontal_SSE2_INTRIN( EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, EB_S16 *firstPassIFDst, EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr, *qtr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr, *qtr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; (void)firstPassIFDst; (void)fracPosy; @@ -1983,7 +1983,7 @@ EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeffSR1[fracPosx]); - c0 = _mm_unpacklo_epi16(c0, c0); + c0 = _mm_unpacklo_epi16(c0, c0); c3 = _mm_shuffle_epi32(c0, 0xff); c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); @@ -2103,16 +2103,16 @@ EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, void ChromaInterpolationFilterOneD16bitVertical_SSE2_INTRIN( EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, EB_S16 *firstPassIFDst, EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr, *qtr; - __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; - __m128i sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr, *qtr; + __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; + __m128i sum; (void)firstPassIFDst; (void)fracPosx; c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeffSR1[fracPosy]); - c0 = _mm_unpacklo_epi16(c0, c0); + c0 = _mm_unpacklo_epi16(c0, c0); c3 = _mm_shuffle_epi32(c0, 0xff); c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); @@ -2122,7 +2122,7 @@ EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); if (puWidth & 2) { - __m128i a4, a5, b2, b3, d0, d1, d2, d3; + __m128i a4, a5, b2, b3, d0, d1, d2, d3; ptr = refPic; qtr = dst; @@ -2238,9 +2238,9 @@ void ChromaInterpolationFilterOneDOutRaw16bitHorizontal_SSE2_INTRIN( EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; (void)firstPassIFDst; (void)fracPosy; @@ -2249,7 +2249,7 @@ void ChromaInterpolationFilterOneDOutRaw16bitHorizontal_SSE2_INTRIN( //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeffSR1[fracPosx]); - c0 = _mm_unpacklo_epi16(c0, c0); + c0 = _mm_unpacklo_epi16(c0, c0); c3 = _mm_shuffle_epi32(c0, 0xff); c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); @@ -2366,16 +2366,16 @@ void ChromaInterpolationFilterOneDOutRaw16bitVertical_SSE2_INTRIN( EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr; - __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; - __m128i sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr; + __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; + __m128i sum; (void)firstPassIFDst; (void)fracPosx; c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeffSR1[fracPosy]); - c0 = _mm_unpacklo_epi16(c0, c0); + c0 = _mm_unpacklo_epi16(c0, c0); c3 = _mm_shuffle_epi32(c0, 0xff); c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); @@ -2385,7 +2385,7 @@ void ChromaInterpolationFilterOneDOutRaw16bitVertical_SSE2_INTRIN( //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); if (puWidth & 2) { - __m128i a4, a5, b2, b3, d0, d1, d2, d3; + __m128i a4, a5, b2, b3, d0, d1, d2, d3; ptr = refPic; a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; @@ -2487,10 +2487,10 @@ void ChromaInterpolationFilterTwoDInRaw16bit_SSE2_INTRIN( EB_U32 puHeight, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *qtr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; - __m128i sum0, sum1; + EB_U32 rowCount, colCount; + EB_U16 *qtr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; + __m128i sum0, sum1; //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); @@ -2616,9 +2616,9 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSE2_INTRIN( EB_U32 puHeight, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; - __m128i sum0, sum1; + EB_U32 rowCount, colCount; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; + __m128i sum0, sum1; //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); @@ -2728,7 +2728,7 @@ void BiPredClipping16bit_SSE2_INTRIN( { EB_U32 rowCount, colCount; __m128i a0, a1; - + if (puWidth & 2) { EB_U16 *qtr = dst; rowCount = puHeight; @@ -2737,12 +2737,12 @@ void BiPredClipping16bit_SSE2_INTRIN( a1 = _mm_load_si128((__m128i *)list1Src); list0Src += 8; list1Src += 8; - + a0 = _mm_adds_epi16(a0, a1); a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; @@ -2750,14 +2750,14 @@ void BiPredClipping16bit_SSE2_INTRIN( rowCount -= 4; } while (rowCount != 0); - + puWidth -= 2; if (puWidth == 0) { return; - } + } dst += 2; } - + if (puWidth & 4) { EB_U16 *qtr = dst; rowCount = puHeight; @@ -2766,7 +2766,7 @@ void BiPredClipping16bit_SSE2_INTRIN( a1 = _mm_load_si128((__m128i *)list1Src); list0Src += 8; list1Src += 8; - + a0 = _mm_adds_epi16(a0, a1); a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); @@ -2777,14 +2777,14 @@ void BiPredClipping16bit_SSE2_INTRIN( rowCount -= 2; } while (rowCount != 0); - + puWidth -= 4; if (puWidth == 0) { return; - } + } dst += 4; } - + colCount = puWidth; do { __m128i a2, a3; @@ -2812,173 +2812,173 @@ void BiPredClipping16bit_SSE2_INTRIN( _mm_storeu_si128((__m128i *)qtr, a0); _mm_storeu_si128((__m128i *)(qtr+dstStride), a2); qtr += 2*dstStride; - + rowCount -= 2; } while (rowCount != 0); - + colCount -= 8; dst += 8; } while (colCount != 0); } - void BiPredClippingOnTheFly16bit_SSE2( - EB_U16 *list0Src, - EB_U32 list0SrcStride, - EB_U16 *list1Src, - EB_U32 list1SrcStride, - EB_U16 *dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight) - { - EB_U32 rowCount, colCount; - __m128i a0, a1; - __m128i a2, a3; - - if (puWidth & 2) { - __m128i a4; - EB_U16 *qtr = dst; - EB_U16 *ptrSrc0 = list0Src; - EB_U16 *ptrSrc1 = list1Src; - rowCount = puHeight; - do { - - a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi32(a0, a1); - a2 = _mm_unpacklo_epi32(a2, a3); - a0 = _mm_unpacklo_epi64(a0, a2); - a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); - a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a4 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a4 = _mm_unpacklo_epi32(a4, a1); - a2 = _mm_unpacklo_epi32(a2, a3); - a4 = _mm_unpacklo_epi64(a4, a2); - a4 = _mm_slli_epi16(a4, BI_SHIFT_10BIT); - a4 = _mm_sub_epi16(a4, _mm_set1_epi16(BI_OFFSET_10BIT)); - - - a0 = _mm_adds_epi16(a0, a4); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); - a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); qtr += dstStride; - rowCount -= 4; - } while (rowCount != 0); - - puWidth -= 2; - if (puWidth == 0) { - return; - } - - list0Src += 2; - list1Src += 2; - dst += 2; - } - - if (puWidth & 4) { - EB_U16 *qtr = dst; - EB_U16 *ptrSrc0 = list0Src; - EB_U16 *ptrSrc1 = list1Src; - rowCount = puHeight; - do { - - a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi64(a0, a1); - a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); - a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi64(a2, a3); - a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); - a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a0 = _mm_adds_epi16(a0, a2/*a1*/); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); - a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - _mm_storel_epi64((__m128i *)qtr, a0); - a0 = _mm_srli_si128(a0, 8); - _mm_storel_epi64((__m128i *)(qtr + dstStride), a0); qtr += 2 * dstStride; - rowCount -= 2; - } while (rowCount != 0); - - puWidth -= 4; - if (puWidth == 0) { - return; - } - - list0Src += 4; - list1Src += 4; - dst += 4; - } - - colCount = puWidth; - do { - EB_U16 *qtr = dst; - EB_U16 *ptrSrc0 = list0Src; - EB_U16 *ptrSrc1 = list1Src; - rowCount = puHeight; - do { - a0 = _mm_loadu_si128((__m128i *)ptrSrc0); - a1 = _mm_loadu_si128((__m128i *)ptrSrc1); - ptrSrc0 += list0SrcStride; - ptrSrc1 += list1SrcStride; - a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); - a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); - a1 = _mm_slli_epi16(a1, BI_SHIFT_10BIT); - a1 = _mm_sub_epi16(a1, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a0 = _mm_adds_epi16(a0, a1); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); - a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - - a2 = _mm_loadu_si128((__m128i *)ptrSrc0); - a3 = _mm_loadu_si128((__m128i *)ptrSrc1); - ptrSrc0 += list0SrcStride; - ptrSrc1 += list1SrcStride; - a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); - a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); - a3 = _mm_slli_epi16(a3, BI_SHIFT_10BIT); - a3 = _mm_sub_epi16(a3, _mm_set1_epi16(BI_OFFSET_10BIT)); - a2 = _mm_adds_epi16(a2, a3); - a2 = _mm_adds_epi16(a2, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a2 = _mm_srai_epi16(a2, BI_AVG_SHIFT_10BIT); - a2 = _mm_max_epi16(a2, _mm_setzero_si128()); - - _mm_storeu_si128((__m128i *)qtr, a0); - _mm_storeu_si128((__m128i *)(qtr + dstStride), a2); - qtr += 2 * dstStride; - - rowCount -= 2; - } while (rowCount != 0); - - colCount -= 8; - list0Src += 8; - list1Src += 8; - dst += 8; - } while (colCount != 0); - - } + void BiPredClippingOnTheFly16bit_SSE2( + EB_U16 *list0Src, + EB_U32 list0SrcStride, + EB_U16 *list1Src, + EB_U32 list1SrcStride, + EB_U16 *dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight) + { + EB_U32 rowCount, colCount; + __m128i a0, a1; + __m128i a2, a3; + + if (puWidth & 2) { + __m128i a4; + EB_U16 *qtr = dst; + EB_U16 *ptrSrc0 = list0Src; + EB_U16 *ptrSrc1 = list1Src; + rowCount = puHeight; + do { + + a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi32(a0, a1); + a2 = _mm_unpacklo_epi32(a2, a3); + a0 = _mm_unpacklo_epi64(a0, a2); + a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); + a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a4 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a4 = _mm_unpacklo_epi32(a4, a1); + a2 = _mm_unpacklo_epi32(a2, a3); + a4 = _mm_unpacklo_epi64(a4, a2); + a4 = _mm_slli_epi16(a4, BI_SHIFT_10BIT); + a4 = _mm_sub_epi16(a4, _mm_set1_epi16(BI_OFFSET_10BIT)); + + + a0 = _mm_adds_epi16(a0, a4); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); + a0 = _mm_max_epi16(a0, _mm_setzero_si128()); + + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); qtr += dstStride; + rowCount -= 4; + } while (rowCount != 0); + + puWidth -= 2; + if (puWidth == 0) { + return; + } + + list0Src += 2; + list1Src += 2; + dst += 2; + } + + if (puWidth & 4) { + EB_U16 *qtr = dst; + EB_U16 *ptrSrc0 = list0Src; + EB_U16 *ptrSrc1 = list1Src; + rowCount = puHeight; + do { + + a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi64(a0, a1); + a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); + a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi64(a2, a3); + a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); + a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a0 = _mm_adds_epi16(a0, a2/*a1*/); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); + a0 = _mm_max_epi16(a0, _mm_setzero_si128()); + _mm_storel_epi64((__m128i *)qtr, a0); + a0 = _mm_srli_si128(a0, 8); + _mm_storel_epi64((__m128i *)(qtr + dstStride), a0); qtr += 2 * dstStride; + rowCount -= 2; + } while (rowCount != 0); + + puWidth -= 4; + if (puWidth == 0) { + return; + } + + list0Src += 4; + list1Src += 4; + dst += 4; + } + + colCount = puWidth; + do { + EB_U16 *qtr = dst; + EB_U16 *ptrSrc0 = list0Src; + EB_U16 *ptrSrc1 = list1Src; + rowCount = puHeight; + do { + a0 = _mm_loadu_si128((__m128i *)ptrSrc0); + a1 = _mm_loadu_si128((__m128i *)ptrSrc1); + ptrSrc0 += list0SrcStride; + ptrSrc1 += list1SrcStride; + a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); + a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); + a1 = _mm_slli_epi16(a1, BI_SHIFT_10BIT); + a1 = _mm_sub_epi16(a1, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a0 = _mm_adds_epi16(a0, a1); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); + a0 = _mm_max_epi16(a0, _mm_setzero_si128()); + + a2 = _mm_loadu_si128((__m128i *)ptrSrc0); + a3 = _mm_loadu_si128((__m128i *)ptrSrc1); + ptrSrc0 += list0SrcStride; + ptrSrc1 += list1SrcStride; + a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); + a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); + a3 = _mm_slli_epi16(a3, BI_SHIFT_10BIT); + a3 = _mm_sub_epi16(a3, _mm_set1_epi16(BI_OFFSET_10BIT)); + a2 = _mm_adds_epi16(a2, a3); + a2 = _mm_adds_epi16(a2, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a2 = _mm_srai_epi16(a2, BI_AVG_SHIFT_10BIT); + a2 = _mm_max_epi16(a2, _mm_setzero_si128()); + + _mm_storeu_si128((__m128i *)qtr, a0); + _mm_storeu_si128((__m128i *)(qtr + dstStride), a2); + qtr += 2 * dstStride; + + rowCount -= 2; + } while (rowCount != 0); + + colCount -= 8; + list0Src += 8; + list1Src += 8; + dst += 8; + } while (colCount != 0); + + } void LumaInterpolationFilterPose16bit_SSE2_INTRIN( EB_U16 *refPic, @@ -3420,4 +3420,4 @@ void ChromaInterpolationCopyOutRaw16bit_SSE2_INTRIN( (void)fracPosx; (void)fracPosy; PictureCopyKernelOutRaw16bit_SSE2_INTRIN(refPic, srcStride, dst, puWidth, puHeight); -} \ No newline at end of file +} diff --git a/Source/Lib/ASM_SSE2/EbMcp_SSE2.h b/Source/Lib/ASM_SSE2/EbMcp_SSE2.h index 09e754b29..335d55c8a 100644 --- a/Source/Lib/ASM_SSE2/EbMcp_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbMcp_SSE2.h @@ -15,27 +15,27 @@ extern EB_ALIGN(16) const EB_S16 IntraPredictionConst_SSE2[344]; /************************************************** * Assembly Declarations **************************************************/ -extern void PictureCopyKernel_SSE2(EB_BYTE src, EB_U32 srcStride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); +extern void PictureCopyKernel_SSE2(EB_BYTE src, EB_U32 srcStride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); void PictureAverageKernel_SSE2(EB_BYTE src0, EB_U32 src0Stride, EB_BYTE src1, EB_U32 src1Stride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); void PictureAverageKernel_SSE2_INTRIN(EB_BYTE src0, EB_U32 src0Stride, EB_BYTE src1, EB_U32 src1Stride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); void PictureAverageKernel1Line_SSE2_INTRIN( - EB_BYTE src0, - EB_BYTE src1, - EB_BYTE dst, - EB_U32 areaWidth); + EB_BYTE src0, + EB_BYTE src1, + EB_BYTE dst, + EB_U32 areaWidth); extern void BiPredClipping16bit_SSE2_INTRIN(EB_U32 puWidth, EB_U32 puHeight, EB_S16 *list0Src, EB_S16 *list1Src, EB_U16 *dst, EB_U32 dstStride); void BiPredClippingOnTheFly16bit_SSE2( - EB_U16 *list0Src, - EB_U32 list0SrcStride, - EB_U16 *list1Src, - EB_U32 list1SrcStride, - EB_U16 *dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight); + EB_U16 *list0Src, + EB_U32 list0SrcStride, + EB_U16 *list1Src, + EB_U32 list1SrcStride, + EB_U16 *dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight); // 16Bit extern void LumaInterpolationCopy16bit_SSE2(EB_U16* refPic, EB_U32 srcStride, EB_U16* dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, EB_S16 *firstPassIFDst); diff --git a/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c index 86bd06fa9..4ae905d4b 100644 --- a/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c @@ -8,137 +8,137 @@ #include "EbDefinitions.h" void SadCalculation_8x8_16x16_SSE2_INTRIN( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 *pBestSad8x8, - EB_U32 *pBestSad16x16, - EB_U32 *pBestMV8x8, - EB_U32 *pBestMV16x16, - EB_U32 mv, - EB_U32 *pSad16x16) + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 *pBestSad8x8, + EB_U32 *pBestSad16x16, + EB_U32 *pBestMV8x8, + EB_U32 *pBestMV16x16, + EB_U32 mv, + EB_U32 *pSad16x16) { __m128i xmm_sad16x16, xmm_sad8x8_0_1, xmm_sad8x8_2_3, xmm_sad16x16_total, sad8x8_0_3, sad8x8_less_than_bitmask, xmm_N1; __m128i sad8x8_greater_or_eq_bitmask, BestMV8x8, BestSad8x8, xmm_pBestSad8x8, xmm_pBestMV8x8, xmm_mv; - srcStride <<= 1; - refStride <<= 1; + srcStride <<= 1; + refStride <<= 1; //sad8x8_0, sad8x8_1 - - xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), + + xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride)), _mm_loadu_si128((__m128i*)(ref+refStride)))); - xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2*srcStride))), _mm_loadu_si128((__m128i*)(ref + (2*refStride)))), xmm_sad8x8_0_1); - xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_0_1); - - src += srcStride<<2; - ref += refStride<<2; - + xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2*srcStride))), _mm_loadu_si128((__m128i*)(ref + (2*refStride)))), xmm_sad8x8_0_1); + xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_0_1); + + src += srcStride<<2; + ref += refStride<<2; + //sad8x8_2, sad8x8_3 - xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), + xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); - xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (2 * refStride)))), xmm_sad8x8_2_3); - xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_2_3); - - xmm_sad16x16 = _mm_add_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3); + xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (2 * refStride)))), xmm_sad8x8_2_3); + xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_2_3); - xmm_sad16x16_total = _mm_slli_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sad16x16, 8), xmm_sad16x16), 1); + xmm_sad16x16 = _mm_add_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3); - *pSad16x16 = _mm_cvtsi128_si32(xmm_sad16x16_total); + xmm_sad16x16_total = _mm_slli_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sad16x16, 8), xmm_sad16x16), 1); - sad8x8_0_3 = _mm_slli_epi32(_mm_packs_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3), 1); + *pSad16x16 = _mm_cvtsi128_si32(xmm_sad16x16_total); - xmm_mv = _mm_cvtsi64_si128(mv); - xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); - xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); + sad8x8_0_3 = _mm_slli_epi32(_mm_packs_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3), 1); + + xmm_mv = _mm_cvtsi64_si128(mv); + xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); + xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); + + xmm_pBestSad8x8 = _mm_loadu_si128((__m128i*)pBestSad8x8); + xmm_pBestMV8x8 = _mm_loadu_si128((__m128i*)pBestMV8x8); - xmm_pBestSad8x8 = _mm_loadu_si128((__m128i*)pBestSad8x8); - xmm_pBestMV8x8 = _mm_loadu_si128((__m128i*)pBestMV8x8); - // sad8x8_0 < pBestSad8x8[0] for 0 to 3 - sad8x8_less_than_bitmask = _mm_cmplt_epi32(sad8x8_0_3, xmm_pBestSad8x8); + sad8x8_less_than_bitmask = _mm_cmplt_epi32(sad8x8_0_3, xmm_pBestSad8x8); + + xmm_N1 = _mm_cmpeq_epi8(xmm_sad8x8_0_1, xmm_sad8x8_0_1); - xmm_N1 = _mm_cmpeq_epi8(xmm_sad8x8_0_1, xmm_sad8x8_0_1); + sad8x8_greater_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad8x8_less_than_bitmask); - sad8x8_greater_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad8x8_less_than_bitmask); + BestSad8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestSad8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, sad8x8_0_3)); + BestMV8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestMV8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, xmm_mv)); - BestSad8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestSad8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, sad8x8_0_3)); - BestMV8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestMV8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, xmm_mv)); + _mm_storeu_si128((__m128i*)pBestSad8x8, BestSad8x8); + _mm_storeu_si128((__m128i*)pBestMV8x8, BestMV8x8); - _mm_storeu_si128((__m128i*)pBestSad8x8, BestSad8x8); - _mm_storeu_si128((__m128i*)pBestMV8x8, BestMV8x8); - - EB_U64 sad16x16 = _mm_cvtsi128_si64(xmm_sad16x16_total); - if (sad16x16 < pBestSad16x16[0]){ - pBestSad16x16[0] = (EB_U32)sad16x16; - pBestMV16x16[0] = _mm_cvtsi128_si32(xmm_mv); - } + EB_U64 sad16x16 = _mm_cvtsi128_si64(xmm_sad16x16_total); + if (sad16x16 < pBestSad16x16[0]){ + pBestSad16x16[0] = (EB_U32)sad16x16; + pBestMV16x16[0] = _mm_cvtsi128_si32(xmm_mv); + } } void SadCalculation_32x32_64x64_SSE2_INTRIN( - EB_U32 *pSad16x16, - EB_U32 *pBestSad32x32, - EB_U32 *pBestSad64x64, - EB_U32 *pBestMV32x32, - EB_U32 *pBestMV64x64, - EB_U32 mv) + EB_U32 *pSad16x16, + EB_U32 *pBestSad32x32, + EB_U32 *pBestSad64x64, + EB_U32 *pBestMV32x32, + EB_U32 *pBestMV64x64, + EB_U32 mv) { __m128i xmm_N1, sad32x32_greater_than_bitmask, sad32x32_less_than_or_eq_bitmask, BestSad32x32, BestMV32x32, xmm_mv; __m128i Sad16x16_0_7_lo, Sad16x16_0_7_hi, Sad16x16_8_15_lo, Sad16x16_8_15_hi, xmm_sad64x64, xmm_sad64x64_total, xmm_pBestSad32x32, xmm_pBestMV32x32; - Sad16x16_0_7_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); - Sad16x16_0_7_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); - Sad16x16_8_15_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); - Sad16x16_8_15_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); + Sad16x16_0_7_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); + Sad16x16_0_7_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); + Sad16x16_8_15_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); + Sad16x16_8_15_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); - xmm_sad64x64 = _mm_add_epi32(_mm_add_epi32(_mm_unpacklo_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo), _mm_unpackhi_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo)), + xmm_sad64x64 = _mm_add_epi32(_mm_add_epi32(_mm_unpacklo_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo), _mm_unpackhi_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo)), _mm_add_epi32(_mm_unpacklo_epi64(Sad16x16_0_7_hi, Sad16x16_8_15_hi), _mm_unpackhi_epi64(Sad16x16_0_7_hi, Sad16x16_8_15_hi))); - xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64, 8), xmm_sad64x64); - - xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64_total, 4), xmm_sad64x64_total); + xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64, 8), xmm_sad64x64); + + xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64_total, 4), xmm_sad64x64_total); + + xmm_mv = _mm_cvtsi32_si128(mv); + xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); + xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); - xmm_mv = _mm_cvtsi32_si128(mv); - xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); - xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); + xmm_pBestSad32x32 = _mm_loadu_si128((__m128i*)pBestSad32x32); + xmm_pBestMV32x32 = _mm_loadu_si128((__m128i*)pBestMV32x32); - xmm_pBestSad32x32 = _mm_loadu_si128((__m128i*)pBestSad32x32); - xmm_pBestMV32x32 = _mm_loadu_si128((__m128i*)pBestMV32x32); + sad32x32_greater_than_bitmask = _mm_cmpgt_epi32(xmm_pBestSad32x32, xmm_sad64x64);// _mm_cmplt_epi32(xmm_pBestSad32x32, xmm_sad64x64); - sad32x32_greater_than_bitmask = _mm_cmpgt_epi32(xmm_pBestSad32x32, xmm_sad64x64);// _mm_cmplt_epi32(xmm_pBestSad32x32, xmm_sad64x64); - - xmm_N1 = _mm_cmpeq_epi8(xmm_mv, xmm_mv); // anything compared to itself is equal (get 0xFFFFFFFF) - sad32x32_less_than_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad32x32_greater_than_bitmask); - - BestSad32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestSad32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_sad64x64, sad32x32_greater_than_bitmask)); - BestMV32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestMV32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_mv, sad32x32_greater_than_bitmask)); + xmm_N1 = _mm_cmpeq_epi8(xmm_mv, xmm_mv); // anything compared to itself is equal (get 0xFFFFFFFF) + sad32x32_less_than_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad32x32_greater_than_bitmask); - _mm_storeu_si128((__m128i*)pBestSad32x32, BestSad32x32); - _mm_storeu_si128((__m128i*)pBestMV32x32, BestMV32x32); + BestSad32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestSad32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_sad64x64, sad32x32_greater_than_bitmask)); + BestMV32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestMV32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_mv, sad32x32_greater_than_bitmask)); + _mm_storeu_si128((__m128i*)pBestSad32x32, BestSad32x32); + _mm_storeu_si128((__m128i*)pBestMV32x32, BestMV32x32); - EB_U32 sad64x64 = _mm_cvtsi128_si32(xmm_sad64x64_total); - if (sad64x64 < pBestSad64x64[0]){ - pBestSad64x64[0] = sad64x64; - pBestMV64x64[0] = _mm_cvtsi128_si32(xmm_mv); - } + + EB_U32 sad64x64 = _mm_cvtsi128_si32(xmm_sad64x64_total); + if (sad64x64 < pBestSad64x64[0]){ + pBestSad64x64[0] = sad64x64; + pBestMV64x64[0] = _mm_cvtsi128_si32(xmm_mv); + } } void InitializeBuffer_32bits_SSE2_INTRIN( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value) + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value) { __m128i xmm1, xmm2; EB_U32 index128; xmm2 = _mm_cvtsi32_si128(Value); xmm1 = _mm_or_si128(_mm_slli_si128(xmm2, 4), xmm2); xmm2 = _mm_or_si128(_mm_slli_si128(xmm1, 8), xmm1); - + for (index128 = 0; index128 < Count128; ++index128){ _mm_storeu_si128((__m128i *)Pointer, xmm2); Pointer += 4; diff --git a/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h b/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h index aadb8e1fe..641a1c81a 100644 --- a/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h @@ -9,35 +9,35 @@ #include "EbDefinitions.h" #ifdef __cplusplus extern "C" { -#endif +#endif extern void InitializeBuffer_32bits_SSE2_INTRIN( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value); + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value); void SadCalculation_8x8_16x16_SSE2_INTRIN( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 *pBestSad8x8, - EB_U32 *pBestSad16x16, - EB_U32 *pBestMV8x8, - EB_U32 *pBestMV16x16, - EB_U32 mv, - EB_U32 *pSad16x16); + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 *pBestSad8x8, + EB_U32 *pBestSad16x16, + EB_U32 *pBestMV8x8, + EB_U32 *pBestMV16x16, + EB_U32 mv, + EB_U32 *pSad16x16); void SadCalculation_32x32_64x64_SSE2_INTRIN( - EB_U32 *pSad16x16, - EB_U32 *pBestSad32x32, - EB_U32 *pBestSad64x64, - EB_U32 *pBestMV32x32, - EB_U32 *pBestMV64x64, - EB_U32 mv); + EB_U32 *pSad16x16, + EB_U32 *pBestSad32x32, + EB_U32 *pBestSad64x64, + EB_U32 *pBestMV32x32, + EB_U32 *pBestMV64x64, + EB_U32 mv); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c index 4f29cb43c..06874f11e 100644 --- a/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c @@ -11,77 +11,77 @@ #include "EbDefinitions.h" void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, EB_U32 height ) { - EB_U32 x, y; + EB_U32 x, y; __m128i xmm_00FF, inPixel0, inPixel1, inPixel1_shftR_2_U8, inPixel0_shftR_2_U8, inPixel0_shftR_2, inPixel1_shftR_2; - xmm_00FF = _mm_set1_epi16(0x00FF); + xmm_00FF = _mm_set1_epi16(0x00FF); if (width == 8) - { - for (y = 0; y < height; y += 2) - { + { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - - } - else if (width == 16) - { + + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + + } + else if (width == 16) + { __m128i inPixel2, inPixel3; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + - - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - } - else if (width == 32) - { + + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + + } + else if (width == 32) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -91,31 +91,31 @@ void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - - } - else if (width == 64) - { + + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + + } + else if (width == 64) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -125,294 +125,294 @@ void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - - out8BitBuffer += out8Stride; - in16BitBuffer += inStride; - } - - } else - { - EB_U32 inStrideDiff = (2 * inStride) - width; - EB_U32 out8StrideDiff = (2 * out8Stride) - width; - - EB_U32 inStrideDiff64 = inStride - width; - EB_U32 out8StrideDiff64 = out8Stride - width; - - if (!(width & 63)) - { - __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; - __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - - for (x = 0; x < height; x += 1){ - for (y = 0; y < width; y += 64){ - - inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); - inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); - inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); - inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 32)); - inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 40)); - inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); - inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); - out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - out8BitBuffer += 64; - in16BitBuffer += 64; - } - in16BitBuffer += inStrideDiff64; - out8BitBuffer += out8StrideDiff64; - } - } - else if (!(width & 31)) - { - __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; - __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 32) - { - inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); - inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); - inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); - inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride)); - inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride + 8)); - inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); - inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); - out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - out8BitBuffer += 32; - in16BitBuffer += 32; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 15)) - { - __m128i inPixel2, inPixel3; - - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 16) - { - inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); - inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - - - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - out8BitBuffer += 16; - in16BitBuffer += 16; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 7)) - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 8) - { - inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - out8BitBuffer += 8; - in16BitBuffer += 8; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 4) - { - inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); - inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); - - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); - *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); - - out8BitBuffer += 4; - in16BitBuffer += 4; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - - } + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + + out8BitBuffer += out8Stride; + in16BitBuffer += inStride; + } + + } else + { + EB_U32 inStrideDiff = (2 * inStride) - width; + EB_U32 out8StrideDiff = (2 * out8Stride) - width; + + EB_U32 inStrideDiff64 = inStride - width; + EB_U32 out8StrideDiff64 = out8Stride - width; + + if (!(width & 63)) + { + __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; + __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; + + for (x = 0; x < height; x += 1){ + for (y = 0; y < width; y += 64){ + + inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); + inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); + inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); + inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 32)); + inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 40)); + inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); + inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); + + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); + + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + out8BitBuffer += 64; + in16BitBuffer += 64; + } + in16BitBuffer += inStrideDiff64; + out8BitBuffer += out8StrideDiff64; + } + } + else if (!(width & 31)) + { + __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; + __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; + + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 32) + { + inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); + inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); + inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); + inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride)); + inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride + 8)); + inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); + inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + out8BitBuffer += 32; + in16BitBuffer += 32; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 15)) + { + __m128i inPixel2, inPixel3; + + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 16) + { + inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); + inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); + inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + + + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + out8BitBuffer += 16; + in16BitBuffer += 16; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 7)) + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 8) + { + inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + out8BitBuffer += 8; + in16BitBuffer += 8; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 4) + { + inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); + inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); + + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); + *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); + + out8BitBuffer += 4; + in16BitBuffer += 4; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + + } return; } void EB_ENC_UnPack8BitData_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, - EB_U32 height) + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, + EB_U32 height) { - EB_U32 x, y; + EB_U32 x, y; __m128i xmm_00FF, inPixel0, inPixel1, inPixel1_shftR_2_U8, inPixel0_shftR_2_U8, inPixel0_shftR_2, inPixel1_shftR_2; // __m128i tempPixel0_U8, tempPixel1_U8; - xmm_00FF = _mm_set1_epi16(0x00FF); + xmm_00FF = _mm_set1_epi16(0x00FF); - if (width == 4) - { - for (y = 0; y < height; y += 2) - { + if (width == 4) + { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); - - //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); - //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); - // - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); - //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); - *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); - *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); - - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 8) - { - for (y = 0; y < height; y += 2) - { + + //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); + //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); + // + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); + //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); + *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); + *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); + + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 8) + { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); - //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); - // - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 16) - { + //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); + //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); + // + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 16) + { __m128i inPixel2, inPixel3; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 32) - { + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 32) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8,*/ out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -422,38 +422,38 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_and_si128(inPixel6, xmm_3), _mm_and_si128(inPixel7, xmm_3)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride + 16), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 64) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 64) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8,*/ out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -463,48 +463,48 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_and_si128(inPixel6, xmm_3), _mm_and_si128(inPixel7, xmm_3)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + 48), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - //outnBitBuffer += outnStride; - out8BitBuffer += out8Stride; - in16BitBuffer += inStride; - } - } - else - { - EB_U32 inStrideDiff = (2 * inStride) - width; - EB_U32 out8StrideDiff = (2 * out8Stride) - width; - //EB_U32 outnStrideDiff = (2 * outnStride) - width; - - EB_U32 inStrideDiff64 = inStride - width; - EB_U32 out8StrideDiff64 = out8Stride - width; - //EB_U32 outnStrideDiff64 = outnStride - width; - - if (!(width & 63)) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + //outnBitBuffer += outnStride; + out8BitBuffer += out8Stride; + in16BitBuffer += inStride; + } + } + else + { + EB_U32 inStrideDiff = (2 * inStride) - width; + EB_U32 out8StrideDiff = (2 * out8Stride) - width; + //EB_U32 outnStrideDiff = (2 * outnStride) - width; + + EB_U32 inStrideDiff64 = inStride - width; + EB_U32 out8StrideDiff64 = out8Stride - width; + //EB_U32 outnStrideDiff64 = outnStride - width; + + if (!(width & 63)) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8, */out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (x = 0; x < height; x += 1){ - for (y = 0; y < width; y += 64){ + for (x = 0; x < height; x += 1){ + for (y = 0; y < width; y += 64){ inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); @@ -515,44 +515,44 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel6, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel7, xmm_3), 6)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + 48), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - //outnBitBuffer += 64; - out8BitBuffer += 64; - in16BitBuffer += 64; - } - in16BitBuffer += inStrideDiff64; - //outnBitBuffer += outnStrideDiff64; - out8BitBuffer += out8StrideDiff64; - } - } - else if (!(width & 31)) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + //outnBitBuffer += 64; + out8BitBuffer += 64; + in16BitBuffer += 64; + } + in16BitBuffer += inStrideDiff64; + //outnBitBuffer += outnStrideDiff64; + out8BitBuffer += out8StrideDiff64; + } + } + else if (!(width & 31)) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8,*/ out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 32) - { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 32) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -562,236 +562,236 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel6, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel7, xmm_3), 6)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride + 16), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - //outnBitBuffer += 32; - out8BitBuffer += 32; - in16BitBuffer += 32; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 15)) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + //outnBitBuffer += 32; + out8BitBuffer += 32; + in16BitBuffer += 32; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 15)) + { __m128i inPixel2, inPixel3; - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 16) - { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 16) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); // - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - - //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - //outnBitBuffer += 16; - out8BitBuffer += 16; - in16BitBuffer += 16; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 7)) - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 8) - { + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + + //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + //outnBitBuffer += 16; + out8BitBuffer += 16; + in16BitBuffer += 16; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 7)) + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 8) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - //outnBitBuffer += 8; - out8BitBuffer += 8; - in16BitBuffer += 8; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 4) - { + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + //outnBitBuffer += 8; + out8BitBuffer += 8; + in16BitBuffer += 8; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 4) + { inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); - - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); - //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); - *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); - *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); - - //outnBitBuffer += 4; - out8BitBuffer += 4; - in16BitBuffer += 4; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - } + + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); + //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); + *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); + *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); + + //outnBitBuffer += 4; + out8BitBuffer += 4; + in16BitBuffer += 4; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + } return; } void UnpackAvg_SSE2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - EB_U32 y; - __m128i inPixel0, inPixel1; + EB_U32 y; + __m128i inPixel0, inPixel1; - - if (width == 4) - { + + if (width == 4) + { __m128i out8_0_U8_L0, out8_0_U8_L1; __m128i avg8_0_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L1); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)dstPtr = _mm_cvtsi128_si32(avg8_0_U8); - //-------- + //-------- //Line Two //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L0+ refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L1+ refL1Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)(dstPtr+dstStride) = _mm_cvtsi128_si32(avg8_0_U8); dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; - - } - - } - else if (width == 8) - { - + ref16L1 += 2*refL1Stride; + + } + + } + else if (width == 8) + { + __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 - inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); + inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + + _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - //-------- //Line Two @@ -801,36 +801,36 @@ void UnpackAvg_SSE2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*)(ref16L0 + refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*)(ref16L1 + refL1Stride) ); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 16) - { + + } + else if (width == 16) + { __m128i inPixel4, inPixel5; __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- @@ -839,22 +839,22 @@ void UnpackAvg_SSE2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); inPixel1 = _mm_loadu_si128((__m128i*) (ref16L0 + 8)); - - out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); + + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); - inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); - + inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - + //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - //-------- //Line Two @@ -863,40 +863,40 @@ void UnpackAvg_SSE2_INTRIN( //List0 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - //List1 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - - //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 32) - { + + } + else if (width == 32) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; __m128i avg8_0_U8, avg8_1_U8, avg8_2_U8, avg8_3_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- @@ -909,7 +909,7 @@ void UnpackAvg_SSE2_INTRIN( inPixel3 = _mm_loadu_si128((__m128i*) (ref16L0 + 24)); out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //List1 @@ -917,16 +917,16 @@ void UnpackAvg_SSE2_INTRIN( inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(ref16L1 + 16)); inPixel3 = _mm_loadu_si128((__m128i*)(ref16L1 + 24)); - + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //AVG avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); - avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); + avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); //-------- @@ -940,7 +940,7 @@ void UnpackAvg_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 24)); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //List1 @@ -950,32 +950,32 @@ void UnpackAvg_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 24)); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - + //AVG avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); - avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); + avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); + + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 64) - { + } + else if (width == 64) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; __m128i avg8_0_U8, avg8_1_U8, avg8_2_U8, avg8_3_U8; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { //List0 inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); @@ -987,14 +987,14 @@ void UnpackAvg_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(ref16L0 + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(ref16L0 + 56)); - + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - + //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); @@ -1005,12 +1005,12 @@ void UnpackAvg_SSE2_INTRIN( inPixel5 = _mm_loadu_si128((__m128i*)(ref16L1 + 40)); inPixel6 = _mm_loadu_si128((__m128i*)(ref16L1 + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(ref16L1 + 56)); - - //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels + + //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //AVG @@ -1019,18 +1019,18 @@ void UnpackAvg_SSE2_INTRIN( avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + - - dstPtr += dstStride; + dstPtr += dstStride; ref16L0 += refL0Stride; - ref16L1 += refL1Stride; - } - } - + ref16L1 += refL1Stride; + } + } + return; } diff --git a/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h b/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h index a1a3e99db..50baef2d0 100644 --- a/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h @@ -13,29 +13,29 @@ extern "C" { #endif void EB_ENC_UnPack8BitData_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, - EB_U32 height); + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, + EB_U32 height); void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, EB_U32 height ); void UnpackAvg_SSE2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height); diff --git a/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c index cb26131b6..533fce0a7 100644 --- a/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c @@ -17,42 +17,42 @@ static __m128i _mm_loadh_epi64(__m128i x, __m128i *p) //------- void FullDistortionKernel4x4_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; __m128i sum = _mm_setzero_si128(); __m128i sum2 = _mm_setzero_si128(); - + rowCount = 2; do { __m128i x0; __m128i y0; __m128i z0; - + x0 = _mm_loadl_epi64((__m128i *)coeff); coeff += coeffStride; x0 = _mm_loadh_epi64(x0, (__m128i *)coeff); coeff += coeffStride; y0 = _mm_loadl_epi64((__m128i *)reconCoeff); reconCoeff += reconCoeffStride; y0 = _mm_loadh_epi64(y0, (__m128i *)reconCoeff); reconCoeff += reconCoeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum2); @@ -64,43 +64,43 @@ void FullDistortionKernel4x4_32bit_BT_SSE2( } void FullDistortionKernel8x8_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; - + __m128i sum = _mm_setzero_si128(); __m128i sum2 = _mm_setzero_si128(); - + rowCount = 8; do { __m128i x0; __m128i y0; __m128i z0; - + x0 = _mm_loadu_si128((__m128i *)(coeff + 0x00)); y0 = _mm_loadu_si128((__m128i *)(reconCoeff + 0x00)); coeff += coeffStride; reconCoeff += reconCoeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum2); @@ -112,61 +112,61 @@ void FullDistortionKernel8x8_32bit_BT_SSE2( } void FullDistortionKernel16MxN_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount, colCount; __m128i sum = _mm_setzero_si128(); __m128i sum2 = _mm_setzero_si128(); - + colCount = areaWidth; do { EB_S16 *coeffTemp = coeff; EB_S16 *reconCoeffTemp = reconCoeff; - + rowCount = areaHeight; do { __m128i x0, x1; __m128i y0, y1; __m128i z0, z1; - + x0 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x00)); x1 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x08)); y0 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x00)); y1 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x08)); coeffTemp += coeffStride; reconCoeffTemp += reconCoeffStride; - + z0 = _mm_madd_epi16(x0, x0); z1 = _mm_madd_epi16(x1, x1); - + sum2 = _mm_add_epi32(sum2, z0); sum2 = _mm_add_epi32(sum2, z1); - + x0 = _mm_sub_epi16(x0, y0); x1 = _mm_sub_epi16(x1, y1); - + x0 = _mm_madd_epi16(x0, x0); x1 = _mm_madd_epi16(x1, x1); - + sum = _mm_add_epi32(sum, x0); sum = _mm_add_epi32(sum, x1); } while (--rowCount); - + coeff += 16; reconCoeff += 16; colCount -= 16; } while (colCount > 0); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum2); @@ -176,37 +176,37 @@ void FullDistortionKernel16MxN_32bit_BT_SSE2( void FullDistortionKernelIntra4x4_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; - + __m128i sum = _mm_setzero_si128(); - + rowCount = 2; do { __m128i x0; __m128i y0; - + x0 = _mm_loadl_epi64((__m128i *)coeff); coeff += coeffStride; x0 = _mm_loadh_epi64(x0, (__m128i *)coeff); coeff += coeffStride; y0 = _mm_loadl_epi64((__m128i *)reconCoeff); reconCoeff += reconCoeffStride; y0 = _mm_loadh_epi64(y0, (__m128i *)reconCoeff); reconCoeff += reconCoeffStride; - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum); sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 @@ -217,37 +217,37 @@ void FullDistortionKernelIntra4x4_32bit_BT_SSE2( } void FullDistortionKernelIntra8x8_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; - + __m128i sum = _mm_setzero_si128(); - + rowCount = 8; do { __m128i x0; __m128i y0; - + x0 = _mm_loadu_si128((__m128i *)(coeff + 0x00)); y0 = _mm_loadu_si128((__m128i *)(reconCoeff + 0x00)); coeff += coeffStride; reconCoeff += reconCoeffStride; - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum); sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 @@ -258,53 +258,53 @@ void FullDistortionKernelIntra8x8_32bit_BT_SSE2( } void FullDistortionKernelIntra16MxN_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount, colCount; __m128i sum = _mm_setzero_si128(); - + colCount = areaWidth; do { EB_S16 *coeffTemp = coeff; EB_S16 *reconCoeffTemp = reconCoeff; - + rowCount = areaHeight; do { __m128i x0, x1; __m128i y0, y1; - + x0 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x00)); x1 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x08)); y0 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x00)); y1 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x08)); coeffTemp += coeffStride; reconCoeffTemp += reconCoeffStride; - + x0 = _mm_sub_epi16(x0, y0); x1 = _mm_sub_epi16(x1, y1); - + x0 = _mm_madd_epi16(x0, x0); x1 = _mm_madd_epi16(x1, x1); - + sum = _mm_add_epi32(sum, x0); sum = _mm_add_epi32(sum, x1); } while (--rowCount); - + coeff += 16; reconCoeff += 16; colCount -= 16; } while (colCount > 0); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum); sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 @@ -314,32 +314,32 @@ void FullDistortionKernelIntra16MxN_32bit_BT_SSE2( void FullDistortionKernelCbfZero4x4_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; __m128i sum2 = _mm_setzero_si128(); - + rowCount = 2; do { __m128i x0; __m128i z0; - + x0 = _mm_loadl_epi64((__m128i *)coeff); coeff += coeffStride; x0 = _mm_loadh_epi64(x0, (__m128i *)coeff); coeff += coeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); } while (--rowCount); - + sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum2 = _mm_unpacklo_epi32(sum2, sum2); sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 @@ -352,32 +352,32 @@ void FullDistortionKernelCbfZero4x4_32bit_BT_SSE2( } void FullDistortionKernelCbfZero8x8_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; __m128i sum2 = _mm_setzero_si128(); - + rowCount = 8; do { __m128i x0; __m128i z0; - + x0 = _mm_loadu_si128((__m128i *)(coeff + 0x00)); coeff += coeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); } while (--rowCount); - + sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum2 = _mm_unpacklo_epi32(sum2, sum2); sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 @@ -390,13 +390,13 @@ void FullDistortionKernelCbfZero8x8_32bit_BT_SSE2( } void FullDistortionKernelCbfZero16MxN_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount, colCount; __m128i sum2 = _mm_setzero_si128(); @@ -405,70 +405,70 @@ void FullDistortionKernelCbfZero16MxN_32bit_BT_SSE2( do { EB_S16 *coeffTemp = coeff; - + rowCount = areaHeight; do { __m128i x0, x1; __m128i z0, z1; - + x0 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x00)); x1 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x08)); coeffTemp += coeffStride; - + z0 = _mm_madd_epi16(x0, x0); z1 = _mm_madd_epi16(x1, x1); - + sum2 = _mm_add_epi32(sum2, z0); sum2 = _mm_add_epi32(sum2, z1); } while (--rowCount); - + coeff += 16; reconCoeff += 16; colCount -= 16; } while (colCount > 0); - + sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum2 = _mm_unpacklo_epi32(sum2, sum2); sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 _mm_storeu_si128((__m128i *)distortionResult, _mm_unpacklo_epi32(sum2, _mm_setzero_si128())); (void)reconCoeffStride; - + } /******************************************************************************* PictureCopyKernel_INTRIN *******************************************************************************/ void PictureCopyKernel4x4_SSE_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) -{ - *(EB_U32 *)dst = *(EB_U32 *)src; - *(EB_U32 *)(dst + dstStride) = *(EB_U32 *)(src + srcStride); - *(EB_U32 *)(dst + (dstStride << 1)) = *(EB_U32 *)(src + (srcStride << 1)); - *(EB_U32 *)(dst + (dstStride * 3)) = *(EB_U32 *)(src + (srcStride * 3)); - - (void)areaWidth; - (void)areaHeight; - - return; + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) +{ + *(EB_U32 *)dst = *(EB_U32 *)src; + *(EB_U32 *)(dst + dstStride) = *(EB_U32 *)(src + srcStride); + *(EB_U32 *)(dst + (dstStride << 1)) = *(EB_U32 *)(src + (srcStride << 1)); + *(EB_U32 *)(dst + (dstStride * 3)) = *(EB_U32 *)(src + (srcStride * 3)); + + (void)areaWidth; + (void)areaHeight; + + return; } void PictureCopyKernel8x8_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) -{ - _mm_storel_epi64((__m128i*)dst, _mm_cvtsi64_si128(*(EB_U64 *)src)); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) +{ + _mm_storel_epi64((__m128i*)dst, _mm_cvtsi64_si128(*(EB_U64 *)src)); _mm_storel_epi64((__m128i*)(dst + srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + srcStride))); _mm_storel_epi64((__m128i*)(dst + (srcStride << 1)), _mm_cvtsi64_si128(*(EB_U64 *)(src + (srcStride << 1)))); _mm_storel_epi64((__m128i*)(dst + 3*srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + 3*srcStride))); @@ -480,35 +480,35 @@ void PictureCopyKernel8x8_SSE2_INTRIN( _mm_storel_epi64((__m128i*)(dst + srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + srcStride))); _mm_storel_epi64((__m128i*)(dst + (srcStride << 1)), _mm_cvtsi64_si128(*(EB_U64 *)(src + (srcStride << 1)))); _mm_storel_epi64((__m128i*)(dst + 3*srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + 3*srcStride))); - - (void)areaWidth; - (void)areaHeight; - return; + (void)areaWidth; + (void)areaHeight; + + return; } void PictureCopyKernel16x16_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); @@ -516,270 +516,270 @@ void PictureCopyKernel16x16_SSE2_INTRIN( _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); - (void)areaWidth; - (void)areaHeight; + (void)areaWidth; + (void)areaHeight; - return; + return; } void PictureCopyKernel32x32_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - EB_U32 y; - - for (y = 0; y < 4; ++y){ - - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + EB_U32 y; + + for (y = 0; y < 4; ++y){ + + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); src += (srcStride << 2); dst += (dstStride << 2); _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); src += (srcStride << 2); dst += (dstStride << 2); - } - (void)areaWidth; - (void)areaHeight; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void PictureCopyKernel64x64_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - EB_U32 y; - - for (y = 0; y < 8; ++y){ - - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); - _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); - _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); + EB_U32 y; + + for (y = 0; y < 8; ++y){ + + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); + _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); src += (srcStride << 2); dst += (dstStride << 2); - + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); - _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); - _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); + _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); src += (srcStride << 2); dst += (dstStride << 2); - } - (void)areaWidth; - (void)areaHeight; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } /******************************************************************************* PictureAdditionKernel_INTRIN *******************************************************************************/ void PictureAdditionKernel4x4_SSE_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - EB_U32 y; + EB_U32 y; __m128i xmm0, recon_0_3; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 4; ++y){ + for (y = 0; y < 4; ++y){ - recon_0_3 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)predPtr), xmm0), _mm_loadl_epi64((__m128i *)residualPtr)), xmm0); + recon_0_3 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)predPtr), xmm0), _mm_loadl_epi64((__m128i *)residualPtr)), xmm0); - *(EB_U32 *)reconPtr = _mm_cvtsi128_si32(recon_0_3); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + *(EB_U32 *)reconPtr = _mm_cvtsi128_si32(recon_0_3); + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } void PictureAdditionKernel8x8_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - __m128i recon_0_7, xmm0; - EB_U32 y; + __m128i recon_0_7, xmm0; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 8; ++y){ + for (y = 0; y < 8; ++y){ - recon_0_7 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)predPtr), xmm0), _mm_loadu_si128((__m128i *)residualPtr)), xmm0); + recon_0_7 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)predPtr), xmm0), _mm_loadu_si128((__m128i *)residualPtr)), xmm0); - *(EB_U64 *)reconPtr = _mm_cvtsi128_si64(recon_0_7); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + *(EB_U64 *)reconPtr = _mm_cvtsi128_si64(recon_0_7); + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } void PictureAdditionKernel16x16_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - __m128i xmm0, xmm_clip_U8, pred_0_15, recon_0_7, recon_8_15; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); + __m128i xmm0, xmm_clip_U8, pred_0_15, recon_0_7, recon_8_15; + EB_U32 y; + + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 16; ++y){ + for (y = 0; y < 16; ++y){ - pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); - recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); - recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); - xmm_clip_U8 = _mm_packus_epi16(recon_0_7, recon_8_15); - - _mm_storeu_si128((__m128i*)reconPtr, xmm_clip_U8); + pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); + recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); + recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); + xmm_clip_U8 = _mm_packus_epi16(recon_0_7, recon_8_15); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + _mm_storeu_si128((__m128i*)reconPtr, xmm_clip_U8); - return; + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; + + return; } void PictureAdditionKernel32x32_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - EB_U32 y; + EB_U32 y; __m128i xmm0, pred_0_15, pred_16_31, recon_0_15_clipped, recon_0_7, recon_8_15, recon_16_23, recon_24_31, recon_16_31_clipped; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 32; ++y){ - pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); + for (y = 0; y < 32; ++y){ + pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); pred_16_31 = _mm_loadu_si128((__m128i *)(predPtr + 16)); - recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); - recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); - recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); - recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); - + recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); + recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); + recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); + recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); + recon_0_15_clipped = _mm_packus_epi16(recon_0_7, recon_8_15); - recon_16_31_clipped = _mm_packus_epi16(recon_16_23, recon_24_31); + recon_16_31_clipped = _mm_packus_epi16(recon_16_23, recon_24_31); _mm_storeu_si128((__m128i*)reconPtr, recon_0_15_clipped); - _mm_storeu_si128((__m128i*)(reconPtr + 16), recon_16_31_clipped); + _mm_storeu_si128((__m128i*)(reconPtr + 16), recon_16_31_clipped); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } void PictureAdditionKernel64x64_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - EB_U32 y; + EB_U32 y; __m128i xmm0, pred_0_15, pred_16_31, pred_32_47, pred_48_63; __m128i recon_0_15_clipped, recon_16_31_clipped, recon_32_47_clipped, recon_48_63_clipped; @@ -787,40 +787,40 @@ void PictureAdditionKernel64x64_SSE2_INTRIN( xmm0 = _mm_setzero_si128(); - for (y = 0; y < 64; ++y){ + for (y = 0; y < 64; ++y){ - pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); + pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); pred_16_31 = _mm_loadu_si128((__m128i *)(predPtr + 16)); pred_32_47 = _mm_loadu_si128((__m128i *)(predPtr + 32)); pred_48_63 = _mm_loadu_si128((__m128i *)(predPtr + 48)); - recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); - recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); - recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); - recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); - recon_32_39 = _mm_add_epi16(_mm_unpacklo_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 32))); - recon_40_47 = _mm_add_epi16(_mm_unpackhi_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 40))); - recon_48_55 = _mm_add_epi16(_mm_unpacklo_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 48))); - recon_56_63 = _mm_add_epi16(_mm_unpackhi_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 56))); + recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); + recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); + recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); + recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); + recon_32_39 = _mm_add_epi16(_mm_unpacklo_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 32))); + recon_40_47 = _mm_add_epi16(_mm_unpackhi_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 40))); + recon_48_55 = _mm_add_epi16(_mm_unpacklo_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 48))); + recon_56_63 = _mm_add_epi16(_mm_unpackhi_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 56))); recon_0_15_clipped = _mm_packus_epi16(recon_0_7, recon_8_15); recon_16_31_clipped = _mm_packus_epi16(recon_16_23, recon_24_31); recon_32_47_clipped = _mm_packus_epi16(recon_32_39, recon_40_47); - recon_48_63_clipped = _mm_packus_epi16(recon_48_55, recon_56_63); + recon_48_63_clipped = _mm_packus_epi16(recon_48_55, recon_56_63); _mm_storeu_si128((__m128i*)reconPtr, recon_0_15_clipped); _mm_storeu_si128((__m128i*)(reconPtr + 16), recon_16_31_clipped); _mm_storeu_si128((__m128i*)(reconPtr + 32), recon_32_47_clipped); - _mm_storeu_si128((__m128i*)(reconPtr + 48), recon_48_63_clipped); + _mm_storeu_si128((__m128i*)(reconPtr + 48), recon_48_63_clipped); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } /****************************************************************************************************** @@ -828,648 +828,648 @@ ResidualKernel ***********************************************************************************************************/ void ResidualKernel4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i residual_0_3, xmm0 = _mm_setzero_si128(); - EB_U32 y; + __m128i residual_0_3, xmm0 = _mm_setzero_si128(); + EB_U32 y; - for (y = 0; y < 4; ++y){ + for (y = 0; y < 4; ++y){ - residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), + residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)pred), xmm0)); - *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); + *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void ResidualKernel8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm0, residual_0_7; - EB_U32 y; + __m128i xmm0, residual_0_7; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 8; ++y){ + for (y = 0; y < 8; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void ResidualKernel16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { __m128i xmm0, residual_0_7, residual_8_15; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); + EB_U32 y; - for (y = 0; y < 16; ++y){ + xmm0 = _mm_setzero_si128(); + + for (y = 0; y < 16; ++y){ - residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void ResidualKernel32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; - EB_U32 y; + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 32; ++y){ + for (y = 0; y < 32; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; - - return; + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; + + return; } void ResidualKernel64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); - - for (y = 0; y < 64; ++y){ - - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; + EB_U32 y; + + xmm0 = _mm_setzero_si128(); + + for (y = 0; y < 64; ++y){ + + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; - - return; + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; + + return; } void ResidualKernelSubSampled4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine) { - __m128i residual_0_3, xmm0 = _mm_setzero_si128(); - EB_U32 y; + __m128i residual_0_3, xmm0 = _mm_setzero_si128(); + EB_U32 y; //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), + residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)pred), xmm0)); - *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); + *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); residual += residualStride; *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)pred), xmm0)); - *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); + *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); } - return; + return; } void ResidualKernelSubSampled8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine - + ) { - __m128i xmm0, residual_0_7; - EB_U32 y; + __m128i xmm0, residual_0_7; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)residual, residual_0_7); residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)residual, residual_0_7); } - return; + return; } void ResidualKernelSubSampled16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine - + ) { __m128i xmm0, residual_0_7, residual_8_15; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); + EB_U32 y; + + xmm0 = _mm_setzero_si128(); //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); } - return; + return; } void ResidualKernelSubSampled32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; - EB_U32 y; + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; + EB_U32 y; + + xmm0 = _mm_setzero_si128(); - xmm0 = _mm_setzero_si128(); - //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); } - return; + return; } void ResidualKernelSubSampled64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; - EB_U32 y; + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ - - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - + for (y = 0; y < areaHeight; ++y){ + + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); //duplicate top field residual to bottom field residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); } - return; + return; } /****************************************************************************************************** ResidualKernel16bit_SSE2_INTRIN ******************************************************************************************************/ void ResidualKernel16bit_SSE2_INTRIN( - EB_U16 *input, - EB_U32 inputStride, - EB_U16 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U16 *input, + EB_U32 inputStride, + EB_U16 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - EB_U32 x, y; + EB_U32 x, y; __m128i residual0, residual1; - - if (areaWidth == 4) - { - for (y = 0; y < areaHeight; y += 2){ - - residual0 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)input), _mm_loadl_epi64((__m128i*)pred)); - residual1 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)(input + inputStride)), _mm_loadl_epi64((__m128i*)(pred + predStride))); - - _mm_storel_epi64((__m128i*)residual, residual0); - _mm_storel_epi64((__m128i*)(residual + residualStride), residual1); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if (areaWidth == 8){ - for (y = 0; y < areaHeight; y += 2){ - - residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); - residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride))); - - _mm_storeu_si128((__m128i*) residual, residual0); - _mm_storeu_si128((__m128i*) (residual + residualStride), residual1); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if(areaWidth == 16){ + + if (areaWidth == 4) + { + for (y = 0; y < areaHeight; y += 2){ + + residual0 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)input), _mm_loadl_epi64((__m128i*)pred)); + residual1 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)(input + inputStride)), _mm_loadl_epi64((__m128i*)(pred + predStride))); + + _mm_storel_epi64((__m128i*)residual, residual0); + _mm_storel_epi64((__m128i*)(residual + residualStride), residual1); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if (areaWidth == 8){ + for (y = 0; y < areaHeight; y += 2){ + + residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); + residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride))); + + _mm_storeu_si128((__m128i*) residual, residual0); + _mm_storeu_si128((__m128i*) (residual + residualStride), residual1); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if(areaWidth == 16){ __m128i residual2, residual3; - for (y = 0; y < areaHeight; y += 2){ - - residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); - residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8))); - residual2 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride))); - residual3 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride+8)), _mm_loadu_si128((__m128i*)(pred + predStride+8))); - - _mm_storeu_si128((__m128i*)residual, residual0); - _mm_storeu_si128((__m128i*)(residual + 8), residual1); - _mm_storeu_si128((__m128i*)(residual+residualStride), residual2); - _mm_storeu_si128((__m128i*)(residual +residualStride+ 8), residual3); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if(areaWidth == 32){ - - for (y = 0; y < areaHeight; y += 2){ + for (y = 0; y < areaHeight; y += 2){ + + residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); + residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8))); + residual2 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride))); + residual3 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride+8)), _mm_loadu_si128((__m128i*)(pred + predStride+8))); + + _mm_storeu_si128((__m128i*)residual, residual0); + _mm_storeu_si128((__m128i*)(residual + 8), residual1); + _mm_storeu_si128((__m128i*)(residual+residualStride), residual2); + _mm_storeu_si128((__m128i*)(residual +residualStride+ 8), residual3); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if(areaWidth == 32){ + + for (y = 0; y < areaHeight; y += 2){ //residual[columnIndex] = ((EB_S16)input[columnIndex]) - ((EB_S16)pred[columnIndex]); - _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); - _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); - _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); - - _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred+predStride + 8)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride+ 16)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride+ 24)))); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if(areaWidth == 64){ // Branch was not tested because the encoder had max tuSize of 32 - - for (y = 0; y < areaHeight; y += 2){ - - //residual[columnIndex] = ((EB_S16)input[columnIndex]) - ((EB_S16)pred[columnIndex]) 8 indices per _mm_sub_epi16 - _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); - _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); - _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); - _mm_storeu_si128((__m128i*) (residual + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 32)), _mm_loadu_si128((__m128i*)(pred + 32)))); - _mm_storeu_si128((__m128i*) (residual + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 40)), _mm_loadu_si128((__m128i*)(pred + 40)))); - _mm_storeu_si128((__m128i*) (residual + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 48)), _mm_loadu_si128((__m128i*)(pred + 48)))); - _mm_storeu_si128((__m128i*) (residual + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 56)), _mm_loadu_si128((__m128i*)(pred + 56)))); - - _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred + predStride + 8)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride + 16)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride + 24)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 32)), _mm_loadu_si128((__m128i*)(pred + predStride + 32)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 40)), _mm_loadu_si128((__m128i*)(pred + predStride + 40)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 48)), _mm_loadu_si128((__m128i*)(pred + predStride + 48)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 56)), _mm_loadu_si128((__m128i*)(pred + predStride + 56)))); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else { - - EB_U32 inputStrideDiff = 2 * inputStride; - EB_U32 predStrideDiff = 2 * predStride; - EB_U32 residualStrideDiff = 2 * residualStride; - inputStrideDiff -= areaWidth; - predStrideDiff -= areaWidth; - residualStrideDiff -= areaWidth; - - if (!(areaWidth & 7)){ - - for (x = 0; x < areaHeight; x += 2){ - for (y = 0; y < areaWidth; y += 8){ - - _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); - - input += 8; - pred += 8; - residual += 8; - } - input = input + inputStrideDiff; - pred = pred + predStrideDiff; - residual = residual + residualStrideDiff; - } - } - else{ - for (x = 0; x < areaHeight; x += 2){ - for (y = 0; y < areaWidth; y += 4){ - - _mm_storel_epi64((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storel_epi64((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); - - input += 4; - pred += 4; - residual += 4; - } - input = input + inputStrideDiff; - pred = pred + predStrideDiff; - residual = residual + residualStrideDiff; - } - } - } - return; + _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); + _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); + _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); + + _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred+predStride + 8)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride+ 16)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride+ 24)))); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if(areaWidth == 64){ // Branch was not tested because the encoder had max tuSize of 32 + + for (y = 0; y < areaHeight; y += 2){ + + //residual[columnIndex] = ((EB_S16)input[columnIndex]) - ((EB_S16)pred[columnIndex]) 8 indices per _mm_sub_epi16 + _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); + _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); + _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); + _mm_storeu_si128((__m128i*) (residual + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 32)), _mm_loadu_si128((__m128i*)(pred + 32)))); + _mm_storeu_si128((__m128i*) (residual + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 40)), _mm_loadu_si128((__m128i*)(pred + 40)))); + _mm_storeu_si128((__m128i*) (residual + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 48)), _mm_loadu_si128((__m128i*)(pred + 48)))); + _mm_storeu_si128((__m128i*) (residual + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 56)), _mm_loadu_si128((__m128i*)(pred + 56)))); + + _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred + predStride + 8)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride + 16)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride + 24)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 32)), _mm_loadu_si128((__m128i*)(pred + predStride + 32)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 40)), _mm_loadu_si128((__m128i*)(pred + predStride + 40)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 48)), _mm_loadu_si128((__m128i*)(pred + predStride + 48)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 56)), _mm_loadu_si128((__m128i*)(pred + predStride + 56)))); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else { + + EB_U32 inputStrideDiff = 2 * inputStride; + EB_U32 predStrideDiff = 2 * predStride; + EB_U32 residualStrideDiff = 2 * residualStride; + inputStrideDiff -= areaWidth; + predStrideDiff -= areaWidth; + residualStrideDiff -= areaWidth; + + if (!(areaWidth & 7)){ + + for (x = 0; x < areaHeight; x += 2){ + for (y = 0; y < areaWidth; y += 8){ + + _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); + + input += 8; + pred += 8; + residual += 8; + } + input = input + inputStrideDiff; + pred = pred + predStrideDiff; + residual = residual + residualStrideDiff; + } + } + else{ + for (x = 0; x < areaHeight; x += 2){ + for (y = 0; y < areaWidth; y += 4){ + + _mm_storel_epi64((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storel_epi64((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); + + input += 4; + pred += 4; + residual += 4; + } + input = input + inputStrideDiff; + pred = pred + predStrideDiff; + residual = residual + residualStrideDiff; + } + } + } + return; } /****************************************************************************************************** @@ -1478,226 +1478,226 @@ void ResidualKernel16bit_SSE2_INTRIN( void PictureAdditionKernel16bit_SSE2_INTRIN( - EB_U16 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U16 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U16 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U16 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { __m128i xmm_0, xmm_Max10bit; - - EB_U32 y, x; - xmm_0 = _mm_setzero_si128(); - xmm_Max10bit = _mm_set1_epi16(1023); + EB_U32 y, x; + + xmm_0 = _mm_setzero_si128(); + xmm_Max10bit = _mm_set1_epi16(1023); - if (width == 4) - { + if (width == 4) + { __m128i xmm_sum_0_3, xmm_sum_s0_s3, xmm_clip3_0_3, xmm_clip3_s0_s3; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ - xmm_sum_0_3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)predPtr), _mm_loadl_epi64((__m128i*)residualPtr)); - xmm_sum_s0_s3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)(predPtr + predStride)), _mm_loadl_epi64((__m128i*)(residualPtr + residualStride))); + xmm_sum_0_3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)predPtr), _mm_loadl_epi64((__m128i*)residualPtr)); + xmm_sum_s0_s3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)(predPtr + predStride)), _mm_loadl_epi64((__m128i*)(residualPtr + residualStride))); - xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_3, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s3, xmm_Max10bit), xmm_0); + xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_3, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s3, xmm_Max10bit), xmm_0); - _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); - _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); + _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); + _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 8){ + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 8){ __m128i xmm_sum_0_7, xmm_sum_s0_s7, xmm_clip3_0_7, xmm_clip3_s0_s7; - for (y = 0; y < height; y += 2){ - - xmm_sum_0_7 = _mm_adds_epi16( _mm_loadu_si128((__m128i*)predPtr),_mm_loadu_si128((__m128i*)residualPtr)); - xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - - xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); - - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 16){ - + for (y = 0; y < height; y += 2){ + + xmm_sum_0_7 = _mm_adds_epi16( _mm_loadu_si128((__m128i*)predPtr),_mm_loadu_si128((__m128i*)residualPtr)); + xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + + xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); + + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 16){ + __m128i sum_0_7, sum_8_15, sum_s0_s7, sum_s8_s15, clip3_0_7, clip3_8_15, clip3_s0_s7, clip3_s8_s15; - for (y = 0; y < height; y += 2){ - - sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); - sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); - - clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); - clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15, xmm_Max10bit), xmm_0); - clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); - clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); - - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 32){ + for (y = 0; y < height; y += 2){ + + sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); + sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); + + clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); + clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15, xmm_Max10bit), xmm_0); + clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); + clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); + + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 32){ __m128i sum_0_7, sum_8_15, sum_16_23, sum_24_31, sum_s0_s7, sum_s8_s15, sum_s16_s23, sum_s24_s31; __m128i clip3_0_7, clip3_8_15, clip3_16_23, clip3_24_31, clip3_s0_s7, clip3_s8_s15, clip3_s16_s23, clip3_s24_s31; - for (y = 0; y < height; y += 2){ - - sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); - sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); - sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); - - sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); - sum_s16_s23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 16)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 16))); - sum_s24_s31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 24)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 24))); - - clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); - clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); - clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); - clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); - - clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); - clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); - clip3_s16_s23 = _mm_max_epi16(_mm_min_epi16(sum_s16_s23, xmm_Max10bit), xmm_0); - clip3_s24_s31 = _mm_max_epi16(_mm_min_epi16(sum_s24_s31, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); - _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); - _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); - - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 16), clip3_s16_s23); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 24), clip3_s24_s31); - - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 64){ // Branch not tested due to Max TU size is 32 at time of development + for (y = 0; y < height; y += 2){ + + sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); + sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); + sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); + + sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); + sum_s16_s23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 16)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 16))); + sum_s24_s31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 24)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 24))); + + clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); + clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); + clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); + clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); + + clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); + clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); + clip3_s16_s23 = _mm_max_epi16(_mm_min_epi16(sum_s16_s23, xmm_Max10bit), xmm_0); + clip3_s24_s31 = _mm_max_epi16(_mm_min_epi16(sum_s24_s31, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); + _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); + _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); + + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 16), clip3_s16_s23); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 24), clip3_s24_s31); + + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 64){ // Branch not tested due to Max TU size is 32 at time of development __m128i sum_0_7, sum_8_15, sum_16_23, sum_24_31, sum_32_39, sum_40_47, sum_48_55, sum_56_63; __m128i clip3_0_7, clip3_8_15, clip3_16_23, clip3_24_31, clip3_32_39, clip3_40_47, clip3_48_55, clip3_56_63; - for (y = 0; y < height; ++y ){ - - sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); - sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); - sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); - sum_32_39 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 32)), _mm_loadu_si128((__m128i*)(residualPtr + 32))); - sum_40_47 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 40)), _mm_loadu_si128((__m128i*)(residualPtr + 40))); - sum_48_55 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 48)), _mm_loadu_si128((__m128i*)(residualPtr + 48))); - sum_56_63 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 56)), _mm_loadu_si128((__m128i*)(residualPtr + 56))); - - clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7 , xmm_Max10bit), xmm_0); - clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); - clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); - clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); - clip3_32_39 = _mm_max_epi16(_mm_min_epi16(sum_32_39, xmm_Max10bit), xmm_0); - clip3_40_47 = _mm_max_epi16(_mm_min_epi16(sum_40_47, xmm_Max10bit), xmm_0); - clip3_48_55 = _mm_max_epi16(_mm_min_epi16(sum_48_55, xmm_Max10bit), xmm_0); - clip3_56_63 = _mm_max_epi16(_mm_min_epi16(sum_56_63, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7 ); - _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15 ); - _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); - _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); - _mm_storeu_si128((__m128i*) (reconPtr + 32), clip3_32_39); - _mm_storeu_si128((__m128i*) (reconPtr + 40), clip3_40_47); - _mm_storeu_si128((__m128i*) (reconPtr + 48), clip3_48_55); - _mm_storeu_si128((__m128i*) (reconPtr + 56), clip3_56_63); - - predPtr += predStride ; - residualPtr += residualStride ; - reconPtr += reconStride ; - } - } - else - { - EB_U32 predStrideDiff = 2 * predStride; - EB_U32 residualStrideDiff = 2 * residualStride; - EB_U32 reconStrideDiff = 2 * reconStride; - predStrideDiff -= width; - residualStrideDiff -= width; - reconStrideDiff -= width; - - if (!(width & 7)){ + for (y = 0; y < height; ++y ){ + + sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); + sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); + sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); + sum_32_39 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 32)), _mm_loadu_si128((__m128i*)(residualPtr + 32))); + sum_40_47 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 40)), _mm_loadu_si128((__m128i*)(residualPtr + 40))); + sum_48_55 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 48)), _mm_loadu_si128((__m128i*)(residualPtr + 48))); + sum_56_63 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 56)), _mm_loadu_si128((__m128i*)(residualPtr + 56))); + + clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7 , xmm_Max10bit), xmm_0); + clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); + clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); + clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); + clip3_32_39 = _mm_max_epi16(_mm_min_epi16(sum_32_39, xmm_Max10bit), xmm_0); + clip3_40_47 = _mm_max_epi16(_mm_min_epi16(sum_40_47, xmm_Max10bit), xmm_0); + clip3_48_55 = _mm_max_epi16(_mm_min_epi16(sum_48_55, xmm_Max10bit), xmm_0); + clip3_56_63 = _mm_max_epi16(_mm_min_epi16(sum_56_63, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7 ); + _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15 ); + _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); + _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); + _mm_storeu_si128((__m128i*) (reconPtr + 32), clip3_32_39); + _mm_storeu_si128((__m128i*) (reconPtr + 40), clip3_40_47); + _mm_storeu_si128((__m128i*) (reconPtr + 48), clip3_48_55); + _mm_storeu_si128((__m128i*) (reconPtr + 56), clip3_56_63); + + predPtr += predStride ; + residualPtr += residualStride ; + reconPtr += reconStride ; + } + } + else + { + EB_U32 predStrideDiff = 2 * predStride; + EB_U32 residualStrideDiff = 2 * residualStride; + EB_U32 reconStrideDiff = 2 * reconStride; + predStrideDiff -= width; + residualStrideDiff -= width; + reconStrideDiff -= width; + + if (!(width & 7)){ __m128i xmm_sum_0_7, xmm_sum_s0_s7, xmm_clip3_0_7, xmm_clip3_s0_s7; - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 8){ + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 8){ - xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride ))); + xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride ))); - xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); + xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); - _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); + _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); - predPtr += 8; - residualPtr += 8; - reconPtr += 8; - } - predPtr += predStrideDiff; - residualPtr += residualStrideDiff; - reconPtr += reconStrideDiff; - } - } - else{ + predPtr += 8; + residualPtr += 8; + reconPtr += 8; + } + predPtr += predStrideDiff; + residualPtr += residualStrideDiff; + reconPtr += reconStrideDiff; + } + } + else{ __m128i xmm_sum_0_7, xmm_sum_s0_s7, xmm_clip3_0_3, xmm_clip3_s0_s3; - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 4){ - - xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - - xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); - - _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); - _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); - - predPtr += 4; - residualPtr += 4; - reconPtr += 4; - } - predPtr += predStrideDiff; - residualPtr += residualStrideDiff; - reconPtr += reconStrideDiff; - } - } - } - return; + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 4){ + + xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + + xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); + + _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); + _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); + + predPtr += 4; + residualPtr += 4; + reconPtr += 4; + } + predPtr += predStrideDiff; + residualPtr += residualStrideDiff; + reconPtr += reconStrideDiff; + } + } + } + return; } diff --git a/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.asm b/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.asm index 0b75519b1..1d71369e9 100644 --- a/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.asm +++ b/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.asm @@ -1,7 +1,7 @@ -; +; ; Copyright(c) 2018 Intel Corporation ; SPDX - License - Identifier: BSD - 2 - Clause - Patent -; +; %include "x64inc.asm" %include "x64Macro.asm" @@ -475,22 +475,22 @@ Label_PictureAverageKernel_SSE2_WIDTH64: movdqu xmm5, [src0+src0Stride+16] movdqu xmm6, [src0+src0Stride+32] movdqu xmm7, [src0+src0Stride+48] - movdqu xmm8, [src1] - pavgb xmm0, xmm8 - movdqu xmm8, [src1+16] - pavgb xmm1, xmm8 - movdqu xmm8, [src1+32] - pavgb xmm2, xmm8 - movdqu xmm8, [src1+48] - pavgb xmm3, xmm8 - movdqu xmm8, [src1+src1Stride] - pavgb xmm4, xmm8 - movdqu xmm8, [src1+src1Stride+16] - pavgb xmm5, xmm8 - movdqu xmm8, [src1+src1Stride+32] - pavgb xmm6, xmm8 - movdqu xmm8, [src1+src1Stride+48] - pavgb xmm7, xmm8 + movdqu xmm8, [src1] + pavgb xmm0, xmm8 + movdqu xmm8, [src1+16] + pavgb xmm1, xmm8 + movdqu xmm8, [src1+32] + pavgb xmm2, xmm8 + movdqu xmm8, [src1+48] + pavgb xmm3, xmm8 + movdqu xmm8, [src1+src1Stride] + pavgb xmm4, xmm8 + movdqu xmm8, [src1+src1Stride+16] + pavgb xmm5, xmm8 + movdqu xmm8, [src1+src1Stride+32] + pavgb xmm6, xmm8 + movdqu xmm8, [src1+src1Stride+48] + pavgb xmm7, xmm8 lea src0, [src0+2*src0Stride] lea src1, [src1+2*src1Stride] movdqu [dst], xmm0 @@ -516,18 +516,18 @@ Label_PictureAverageKernel_SSE2_WIDTH48: movdqu xmm3, [src0+src0Stride] movdqu xmm4, [src0+src0Stride+16] movdqu xmm5, [src0+src0Stride+32] - movdqu xmm6, [src1] - pavgb xmm0, xmm6 - movdqu xmm6, [src1+16] - pavgb xmm1, xmm6 - movdqu xmm6, [src1+32] - pavgb xmm2, xmm6 - movdqu xmm6, [src1+src1Stride] - pavgb xmm3, xmm6 - movdqu xmm6, [src1+src1Stride+16] - pavgb xmm4, xmm6 - movdqu xmm6, [src1+src1Stride+32] - pavgb xmm5, xmm6 + movdqu xmm6, [src1] + pavgb xmm0, xmm6 + movdqu xmm6, [src1+16] + pavgb xmm1, xmm6 + movdqu xmm6, [src1+32] + pavgb xmm2, xmm6 + movdqu xmm6, [src1+src1Stride] + pavgb xmm3, xmm6 + movdqu xmm6, [src1+src1Stride+16] + pavgb xmm4, xmm6 + movdqu xmm6, [src1+src1Stride+32] + pavgb xmm5, xmm6 lea src0, [src0+2*src0Stride] lea src1, [src1+2*src1Stride] movdqu [dst], xmm0 @@ -549,14 +549,14 @@ Label_PictureAverageKernel_SSE2_WIDTH32: movdqu xmm1, [src0+16] movdqu xmm2, [src0+src0Stride] movdqu xmm3, [src0+src0Stride+16] - movdqu xmm4, [src1] - pavgb xmm0, xmm4 - movdqu xmm4, [src1+16] - pavgb xmm1, xmm4 - movdqu xmm4, [src1+src1Stride] - pavgb xmm2, xmm4 - movdqu xmm4, [src1+src1Stride+16] - pavgb xmm3, xmm4 + movdqu xmm4, [src1] + pavgb xmm0, xmm4 + movdqu xmm4, [src1+16] + pavgb xmm1, xmm4 + movdqu xmm4, [src1+src1Stride] + pavgb xmm2, xmm4 + movdqu xmm4, [src1+src1Stride+16] + pavgb xmm3, xmm4 lea src0, [src0+2*src0Stride] lea src1, [src1+2*src1Stride] movdqu [dst], xmm0 @@ -603,10 +603,10 @@ Label_PictureAverageKernel_SSE2_WIDTH24: Label_PictureAverageKernel_SSE2_WIDTH16: movdqu xmm0, [src0] movdqu xmm1, [src0+src0Stride] - movdqu xmm4, [src1] - pavgb xmm0, xmm4 - movdqu xmm4, [src1+src1Stride] - pavgb xmm1, xmm4 + movdqu xmm4, [src1] + pavgb xmm0, xmm4 + movdqu xmm4, [src1+src1Stride] + pavgb xmm1, xmm4 lea src0, [src0+2*src0Stride] lea src1, [src1+2*src1Stride] movdqu [dst], xmm0 @@ -620,7 +620,7 @@ Label_PictureAverageKernel_SSE2_WIDTH16: ret ; ---------------------------------------------------------------------------------------- - cglobal Log2f_SSE2 - bsr rax, r0 - ret + cglobal Log2f_SSE2 + bsr rax, r0 + ret diff --git a/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h b/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h index cf81d0541..027b84a42 100644 --- a/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h @@ -121,220 +121,220 @@ extern void ZeroOutCoeff32x32_SSE2( EB_U32 areaHeight); extern void ResidualKernel16bit_SSE2_INTRIN( - EB_U16 *input, - EB_U32 inputStride, - EB_U16 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U16 *input, + EB_U32 inputStride, + EB_U16 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel4x4_SSE_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel8x8_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel16x16_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel32x32_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel64x64_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureAdditionKernel4x4_SSE_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel8x8_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel16x16_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel32x32_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel64x64_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void ResidualKernel4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernel8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernel16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernelSubSampled4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine ); void ResidualKernelSubSampled8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernelSubSampled16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernelSubSampled32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernelSubSampled64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernel32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernel64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureAdditionKernel16bit_SSE2_INTRIN( - EB_U16 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U16 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U16 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U16 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); diff --git a/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h b/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h index bcc3b4eda..8243dc868 100644 --- a/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h @@ -23,12 +23,12 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] extern EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( - EB_U16 *reconSamplePtr, - EB_U32 reconStride, - EB_U32 saoBandPosition, - EB_S8 *saoOffsetPtr, - EB_U32 lcuHeight, - EB_U32 lcuWidth); + EB_U16 *reconSamplePtr, + EB_U32 reconStride, + EB_U32 saoBandPosition, + EB_S8 *saoOffsetPtr, + EB_U32 lcuHeight, + EB_U32 lcuWidth); extern EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( EB_U16 *reconSamplePtr, @@ -67,4 +67,4 @@ extern EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c index 25ecc6b96..88473e663 100644 --- a/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c @@ -30,29 +30,29 @@ static void countEdge(__m128i *eoDiff, __m128i *eoCount, EB_BYTE ptr, EB_S32 off __m128i x1, x2; __m128i c1, c2; __m128i cat, select; - + x1 = _mm_loadu_si128((__m128i *)(ptr + offset)); x2 = _mm_loadu_si128((__m128i *)(ptr - offset)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); x2 = _mm_xor_si128(x2, _mm_set1_epi8(-128)); - + c1 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x1), _mm_cmpgt_epi8(x0, x1)); c2 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x2), _mm_cmpgt_epi8(x0, x2)); cat = _mm_add_epi8(c1, c2); cat = _mm_and_si128(cat, mask); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(-2)); eoCount[0] = _mm_sub_epi8(eoCount[0], select); eoDiff[0] = _mm_add_epi64(eoDiff[0], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(-1)); eoCount[1] = _mm_sub_epi8(eoCount[1], select); eoDiff[1] = _mm_add_epi64(eoDiff[1], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(1)); eoCount[2] = _mm_sub_epi8(eoCount[2], select); eoDiff[2] = _mm_add_epi64(eoDiff[2], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(2)); eoCount[3] = _mm_sub_epi8(eoCount[3], select); eoDiff[3] = _mm_add_epi64(eoDiff[3], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); @@ -102,7 +102,7 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_BT_SSE2( EB_U32 lcuWidth, // input parameter, LCU width EB_U32 lcuHeight, // input parameter, LCU height EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { @@ -263,28 +263,28 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_BT_SSE2( EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2( - EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U8 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES+1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES+1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U8 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES+1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES+1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { EB_S32 colCount, rowCount; EB_S32 i, j; - + __m128i eoDiffX[SAO_EO_TYPES][SAO_EO_CATEGORIES]; __m128i eoCountX[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - + lcuWidth -= 2; lcuHeight -= 2; inputSamplePtr += inputStride + 1; reconSamplePtr += reconStride + 1; - + colCount = lcuWidth; - + for (i = 1; i < SAO_EO_TYPES; i++) { for (j = 0; j < SAO_EO_CATEGORIES; j++) @@ -293,52 +293,52 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2( eoCountX[i][j] = _mm_setzero_si128(); } } - + do { __m128i mask; EB_BYTE ptr = reconSamplePtr; EB_BYTE qtr = inputSamplePtr; EB_S32 idx; - + rowCount = lcuHeight; - + idx = (colCount >> 1) - 1; - mask = (idx >= 0 && idx < 8) ? _mm_loadu_si128((__m128i *)maskTable[idx]) : _mm_loadu_si128((__m128i *)maskTable[7]); + mask = (idx >= 0 && idx < 8) ? _mm_loadu_si128((__m128i *)maskTable[idx]) : _mm_loadu_si128((__m128i *)maskTable[7]); do { __m128i x0, y0; __m128i diff; x0 = _mm_loadu_si128((__m128i *)ptr); y0 = _mm_loadu_si128((__m128i *)qtr); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); y0 = _mm_xor_si128(y0, _mm_set1_epi8(-128)); diff = _mm_subs_epi8(y0, x0); diff = _mm_and_si128(diff, mask); // Edge offset - + // Add 128 to difference to make it an unsigned integer to allow use of _mm_sad_epu8 intrinsic // This difference will be subtracted from the end result diff = _mm_xor_si128(diff, _mm_set1_epi8(-128)); - + countEdge(eoDiffX[1], eoCountX[1], ptr, reconStride, x0, diff, mask); countEdge(eoDiffX[2], eoCountX[2], ptr, reconStride+1, x0, diff, mask); countEdge(eoDiffX[3], eoCountX[3], ptr, reconStride-1, x0, diff, mask); - + ptr += reconStride; qtr += inputStride; } while (--rowCount); - + reconSamplePtr += 16; inputSamplePtr += 16; - + colCount -= 16; } while (colCount > 0); - + for (i = 1; i < SAO_EO_TYPES; i++) { for (j = 0; j < SAO_EO_CATEGORIES; j++) @@ -346,17 +346,17 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2( __m128i x0; EB_U32 *p; EB_U16/*EB_U32*/ count; - + // Note: accumulation of counts over 8 bits is ok since the maximum count is 62*4 = 248 x0 = _mm_sad_epu8(eoCountX[i][j], _mm_setzero_si128()); count =(EB_U16)(_mm_extract_epi32(x0, 0) + _mm_extract_epi32(x0, 2)); eoCount[i][j] = count; - + // Note: subtracting 128 that was previously added in main loop p = (EB_U32 *)&eoDiffX[i][j]; eoDiff[i][j] = p[0] + p[2] - 128 * count; } } - + return EB_ErrorNone; } diff --git a/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c index 5bb761d32..3521f419a 100644 --- a/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c @@ -87,7 +87,7 @@ /*sum4 = _mm_add_epi32(_mm_madd_epi16(XMM7, _mm_loadu_si128((__m128i *)(MEM + OFST3))), _mm_madd_epi16(XMM8, _mm_loadu_si128((__m128i *)(MEM + OFST4))));*/\ /*sum3 = _mm_srai_epi32(_mm_add_epi32(XMM_OFST, _mm_add_epi32(sum3, sum4)), SHIFT);*/\ /*sum = _mm_packs_epi32(sum1, sum3);*/\ - sum = _mm_packs_epi32(sum1, sum1);\ + sum = _mm_packs_epi32(sum1, sum1);\ INSTR((__m128i *)(DST + OFST5), sum); #define MACRO_TRANS_8MAC_PF_N4(XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM_OFST, MEM, OFST1, OFST2, OFST3, OFST4, SHIFT, INSTR, DST, OFST5)\ sum1 = _mm_add_epi32(_mm_madd_epi16(XMM1, _mm_loadu_si128((__m128i *)(MEM + OFST1))), _mm_madd_epi16(XMM2, _mm_loadu_si128((__m128i *)(MEM + OFST2))));\ @@ -97,7 +97,7 @@ /*sum4 = _mm_add_epi32(_mm_madd_epi16(XMM7, _mm_loadu_si128((__m128i *)(MEM + OFST3))), _mm_madd_epi16(XMM8, _mm_loadu_si128((__m128i *)(MEM + OFST4))));*/\ /*sum3 = _mm_srai_epi32(_mm_add_epi32(XMM_OFST, _mm_add_epi32(sum3, sum4)), SHIFT);*/\ /*sum = _mm_packs_epi32(sum1, sum3);*/\ - sum = _mm_packs_epi32(sum1, sum1);\ + sum = _mm_packs_epi32(sum1, sum1);\ INSTR((__m128i *)(DST + OFST5), sum); #ifdef __linux__ @@ -674,132 +674,132 @@ static void PfreqTranspose32_SSE2( } static void PfreqN4SecTranspose32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - - i = j = 0; - { - { - __m128i a0, a1, a2, a3, a4, a5, a6, a7; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); - a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); - a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); - a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); - a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); - a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); - a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); - a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); - - b0 = _mm_unpacklo_epi16(a0, a4); - b1 = _mm_unpacklo_epi16(a1, a5); - b2 = _mm_unpacklo_epi16(a2, a6); - b3 = _mm_unpacklo_epi16(a3, a7); - b4 = _mm_unpackhi_epi16(a0, a4); - b5 = _mm_unpackhi_epi16(a1, a5); - b6 = _mm_unpackhi_epi16(a2, a6); - b7 = _mm_unpackhi_epi16(a3, a7); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - a4 = _mm_unpacklo_epi16(b4, b6); - a5 = _mm_unpacklo_epi16(b5, b7); - a6 = _mm_unpackhi_epi16(b4, b6); - a7 = _mm_unpackhi_epi16(b5, b7); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - b4 = _mm_unpacklo_epi16(a4, a5); - b5 = _mm_unpackhi_epi16(a4, a5); - b6 = _mm_unpacklo_epi16(a6, a7); - b7 = _mm_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); - - } - } - } + EB_U32 i, j; + + i = j = 0; + { + { + __m128i a0, a1, a2, a3, a4, a5, a6, a7; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); + a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); + a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); + a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); + a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); + a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); + a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); + a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); + + b0 = _mm_unpacklo_epi16(a0, a4); + b1 = _mm_unpacklo_epi16(a1, a5); + b2 = _mm_unpacklo_epi16(a2, a6); + b3 = _mm_unpacklo_epi16(a3, a7); + b4 = _mm_unpackhi_epi16(a0, a4); + b5 = _mm_unpackhi_epi16(a1, a5); + b6 = _mm_unpackhi_epi16(a2, a6); + b7 = _mm_unpackhi_epi16(a3, a7); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + a4 = _mm_unpacklo_epi16(b4, b6); + a5 = _mm_unpacklo_epi16(b5, b7); + a6 = _mm_unpackhi_epi16(b4, b6); + a7 = _mm_unpackhi_epi16(b5, b7); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + b4 = _mm_unpacklo_epi16(a4, a5); + b5 = _mm_unpackhi_epi16(a4, a5); + b6 = _mm_unpacklo_epi16(a6, a7); + b7 = _mm_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); + + } + } + } static void PfreqN4FirstTranspose32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - - for (i = 0; i < 4; i++) - { - //for (j = 0; j < 2; j++) - j = 0; - { - - __m128i a0, a1, a2, a3, a4, a5, a6, a7; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); - a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); - a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); - a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); - a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); - a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); - a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); - a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); - - b0 = _mm_unpacklo_epi16(a0, a4); - b1 = _mm_unpacklo_epi16(a1, a5); - b2 = _mm_unpacklo_epi16(a2, a6); - b3 = _mm_unpacklo_epi16(a3, a7); - b4 = _mm_unpackhi_epi16(a0, a4); - b5 = _mm_unpackhi_epi16(a1, a5); - b6 = _mm_unpackhi_epi16(a2, a6); - b7 = _mm_unpackhi_epi16(a3, a7); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - a4 = _mm_unpacklo_epi16(b4, b6); - a5 = _mm_unpacklo_epi16(b5, b7); - a6 = _mm_unpackhi_epi16(b4, b6); - a7 = _mm_unpackhi_epi16(b5, b7); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - b4 = _mm_unpacklo_epi16(a4, a5); - b5 = _mm_unpackhi_epi16(a4, a5); - b6 = _mm_unpacklo_epi16(a6, a7); - b7 = _mm_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); - - } - } - } + EB_U32 i, j; + + for (i = 0; i < 4; i++) + { + //for (j = 0; j < 2; j++) + j = 0; + { + + __m128i a0, a1, a2, a3, a4, a5, a6, a7; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); + a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); + a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); + a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); + a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); + a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); + a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); + a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); + + b0 = _mm_unpacklo_epi16(a0, a4); + b1 = _mm_unpacklo_epi16(a1, a5); + b2 = _mm_unpacklo_epi16(a2, a6); + b3 = _mm_unpacklo_epi16(a3, a7); + b4 = _mm_unpackhi_epi16(a0, a4); + b5 = _mm_unpackhi_epi16(a1, a5); + b6 = _mm_unpackhi_epi16(a2, a6); + b7 = _mm_unpackhi_epi16(a3, a7); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + a4 = _mm_unpacklo_epi16(b4, b6); + a5 = _mm_unpacklo_epi16(b5, b7); + a6 = _mm_unpackhi_epi16(b4, b6); + a7 = _mm_unpackhi_epi16(b5, b7); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + b4 = _mm_unpacklo_epi16(a4, a5); + b5 = _mm_unpackhi_epi16(a4, a5); + b6 = _mm_unpacklo_epi16(a6, a7); + b7 = _mm_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); + + } + } + } void PfreqTranspose32Type1_SSE2( EB_S16 *src, @@ -1812,314 +1812,6 @@ static void Pfreq2DTransform32_SSE2( } static void PfreqN41DTransform32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) -{ - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); - const __m128i *coeff32 = (const __m128i *)coeff_tbl; - - for (i = 0; i < 32; i++) - { - __m128i x0, x1, x2, x3; - __m128i y0, y1, y2, y3; - __m128i a0, a2, a4/*, a5*/; - __m128i b0, b1, b2, b3, b4/*, b5*/; - - - b1 = s0; - b3 = s0; - - x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); - x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); - x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); - - - // 32-point butterfly - x2 = reverse_epi16(x2); - x3 = reverse_epi16(x3); - - y0 = _mm_add_epi16(x0, x3); - y1 = _mm_add_epi16(x1, x2); - - y2 = _mm_sub_epi16(x0, x3); - y3 = _mm_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = reverse_epi16(y1); - - x0 = _mm_add_epi16(y0, y1); - x1 = _mm_sub_epi16(y0, y1); - - - x2 = y2; - x3 = y3; - - - - a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); - - /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); - //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); - b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); - //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); - b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); - /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); - //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); - //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); - - x0 = _mm_packs_epi32(b0, b1); - x1 = _mm_packs_epi32(b2, b3); - x2 = _mm_packs_epi32(b4, b4); - - //x3 = _mm_packs_epi32(b6, b7); - - y0 = _mm_unpacklo_epi16(x0, x1); - //y1 = _mm_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm_unpacklo_epi16(y0, y2); - /**/// x1 = _mm_unpackhi_epi16(y0, y2); - //x2 = _mm_unpacklo_epi16(y1, y3); - //x3 = _mm_unpackhi_epi16(y1, y3); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); - /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); - } -} -static void PfreqN42DTransform32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) -{ - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); - const __m128i *coeff32 = (const __m128i *)coeff_tbl; - - for (i = 0; i < 8; i++) - - { - __m128i x0, x1, x2, x3; - __m128i y0, y1, y2, y3; - __m128i a0, a2, a4/*, a5*/; - __m128i b0, b1, b2, b3, b4/*, b5*/; - - b1 = s0; - b3 = s0; - - x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); - x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); - x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); - - - // 32-point butterfly - x2 = reverse_epi16(x2); - x3 = reverse_epi16(x3); - - y0 = _mm_add_epi16(x0, x3); - y1 = _mm_add_epi16(x1, x2); - - y2 = _mm_sub_epi16(x0, x3); - y3 = _mm_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = reverse_epi16(y1); - - x0 = _mm_add_epi16(y0, y1); - x1 = _mm_sub_epi16(y0, y1); - - - x2 = y2; - x3 = y3; - - - - a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); - - /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); - //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); - b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); - //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); - b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); - /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); - //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); - //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); - - x0 = _mm_packs_epi32(b0, b1); - x1 = _mm_packs_epi32(b2, b3); - x2 = _mm_packs_epi32(b4, b4);//do not use b5 - - //x3 = _mm_packs_epi32(b6, b7); - - y0 = _mm_unpacklo_epi16(x0, x1); - //y1 = _mm_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm_unpacklo_epi16(y0, y2); - /**/// x1 = _mm_unpackhi_epi16(y0, y2); - //x2 = _mm_unpacklo_epi16(y1, y3); - //x3 = _mm_unpackhi_epi16(y1, y3); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); - /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); - - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); - } -} - -void Transform32x32_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) -{ - Transform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); - Transpose32_SSE2(intermediate, 32, dst, dst_stride); - Transform32_SSE2(dst, dst_stride, intermediate, 32, 9); - Transpose32_SSE2(intermediate, 32, dst, dst_stride); - - return; -} - -void PfreqN4Transform32x32_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) -{ - PfreqN41DTransform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); - PfreqN4FirstTranspose32_SSE2(intermediate, 32, dst, dst_stride); - PfreqN42DTransform32_SSE2(dst, dst_stride, intermediate, 32, 9); - PfreqN4SecTranspose32_SSE2(intermediate, 32, dst, dst_stride); - - return; -} - -static void Pfreq1DTransform16_SSE2( EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, @@ -2131,19 +1823,32 @@ static void Pfreq1DTransform16_SSE2( __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl; - for (i = 0; i < 16; i++) + for (i = 0; i < 32; i++) { - __m128i x0, x1; - __m128i y0, y1; - __m128i a0, a2; - __m128i b0, b1, b2, b3; + __m128i x0, x1, x2, x3; + __m128i y0, y1, y2, y3; + __m128i a0, a2, a4/*, a5*/; + __m128i b0, b1, b2, b3, b4/*, b5*/; + b1 = s0; b3 = s0; - y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); + x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); + + + // 32-point butterfly + x2 = reverse_epi16(x2); + x3 = reverse_epi16(x3); + y0 = _mm_add_epi16(x0, x3); + y1 = _mm_add_epi16(x1, x2); + + y2 = _mm_sub_epi16(x0, x3); + y3 = _mm_sub_epi16(x1, x2); // 16-point butterfly y1 = reverse_epi16(y1); @@ -2151,29 +1856,99 @@ static void Pfreq1DTransform16_SSE2( x0 = _mm_add_epi16(y0, y1); x1 = _mm_sub_epi16(y0, y1); + + x2 = y2; + x3 = y3; + + + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); + + /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); + b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); + /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); + //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); + //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); x0 = _mm_packs_epi32(b0, b1); x1 = _mm_packs_epi32(b2, b3); + x2 = _mm_packs_epi32(b4, b4); + + //x3 = _mm_packs_epi32(b6, b7); y0 = _mm_unpacklo_epi16(x0, x1); + //y1 = _mm_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm_unpacklo_epi16(y0, y2); + /**/// x1 = _mm_unpackhi_epi16(y0, y2); + //x2 = _mm_unpacklo_epi16(y1, y3); + //x3 = _mm_unpackhi_epi16(y1, y3); - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0); + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); + /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); } } - -static void Pfreq2DTransform16_SSE2( +static void PfreqN42DTransform32_SSE2( EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, @@ -2186,23 +1961,248 @@ static void Pfreq2DTransform16_SSE2( const __m128i *coeff32 = (const __m128i *)coeff_tbl; for (i = 0; i < 8; i++) + { - __m128i x0, x1; - __m128i y0, y1; - __m128i a0, a2; - __m128i b0, b1, b2, b3; + __m128i x0, x1, x2, x3; + __m128i y0, y1, y2, y3; + __m128i a0, a2, a4/*, a5*/; + __m128i b0, b1, b2, b3, b4/*, b5*/; b1 = s0; b3 = s0; - y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); + x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); - // 16-point butterfly - y1 = reverse_epi16(y1); + // 32-point butterfly + x2 = reverse_epi16(x2); + x3 = reverse_epi16(x3); - x0 = _mm_add_epi16(y0, y1); + y0 = _mm_add_epi16(x0, x3); + y1 = _mm_add_epi16(x1, x2); + + y2 = _mm_sub_epi16(x0, x3); + y3 = _mm_sub_epi16(x1, x2); + + // 16-point butterfly + y1 = reverse_epi16(y1); + + x0 = _mm_add_epi16(y0, y1); + x1 = _mm_sub_epi16(y0, y1); + + + x2 = y2; + x3 = y3; + + + + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + + //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); + + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + + //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); + + /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); + + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); + b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); + b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); + /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); + //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); + //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); + + x0 = _mm_packs_epi32(b0, b1); + x1 = _mm_packs_epi32(b2, b3); + x2 = _mm_packs_epi32(b4, b4);//do not use b5 + + //x3 = _mm_packs_epi32(b6, b7); + + y0 = _mm_unpacklo_epi16(x0, x1); + //y1 = _mm_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm_unpacklo_epi16(y0, y2); + /**/// x1 = _mm_unpackhi_epi16(y0, y2); + //x2 = _mm_unpacklo_epi16(y1, y3); + //x3 = _mm_unpackhi_epi16(y1, y3); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); + /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); + + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); + } +} + +void Transform32x32_SSE2( + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) +{ + Transform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); + Transpose32_SSE2(intermediate, 32, dst, dst_stride); + Transform32_SSE2(dst, dst_stride, intermediate, 32, 9); + Transpose32_SSE2(intermediate, 32, dst, dst_stride); + + return; +} + +void PfreqN4Transform32x32_SSE2( + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) +{ + PfreqN41DTransform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); + PfreqN4FirstTranspose32_SSE2(intermediate, 32, dst, dst_stride); + PfreqN42DTransform32_SSE2(dst, dst_stride, intermediate, 32, 9); + PfreqN4SecTranspose32_SSE2(intermediate, 32, dst, dst_stride); + + return; +} + +static void Pfreq1DTransform16_SSE2( + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) +{ + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); + const __m128i *coeff32 = (const __m128i *)coeff_tbl; + + for (i = 0; i < 16; i++) + { + __m128i x0, x1; + __m128i y0, y1; + __m128i a0, a2; + __m128i b0, b1, b2, b3; + + b1 = s0; + b3 = s0; + + y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + + + // 16-point butterfly + y1 = reverse_epi16(y1); + + x0 = _mm_add_epi16(y0, y1); + x1 = _mm_sub_epi16(y0, y1); + + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + + x0 = _mm_packs_epi32(b0, b1); + x1 = _mm_packs_epi32(b2, b3); + + y0 = _mm_unpacklo_epi16(x0, x1); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0); + } +} + +static void Pfreq2DTransform16_SSE2( + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) +{ + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); + const __m128i *coeff32 = (const __m128i *)coeff_tbl; + + for (i = 0; i < 8; i++) + { + __m128i x0, x1; + __m128i y0, y1; + __m128i a0, a2; + __m128i b0, b1, b2, b3; + + b1 = s0; + b3 = s0; + + y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + + + // 16-point butterfly + y1 = reverse_epi16(y1); + + x0 = _mm_add_epi16(y0, y1); x1 = _mm_sub_epi16(y0, y1); a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); @@ -2306,162 +2306,162 @@ void PfreqTransform16x16_SSE2( } static void PfreqN42DTransform16_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) { - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); - const __m128i *coeff32 = (const __m128i *)coeff_tbl; + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); + const __m128i *coeff32 = (const __m128i *)coeff_tbl; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) - { - __m128i x0, x1; - __m128i y0, y1; - __m128i a0, a2; - __m128i b0, b1, b2, b3; + { + __m128i x0, x1; + __m128i y0, y1; + __m128i a0, a2; + __m128i b0, b1, b2, b3; - b1 = s0; - b3 = s0; + b1 = s0; + b3 = s0; - y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); - // 16-point butterfly - y1 = reverse_epi16(y1); + // 16-point butterfly + y1 = reverse_epi16(y1); - x0 = _mm_add_epi16(y0, y1); - x1 = _mm_sub_epi16(y0, y1); + x0 = _mm_add_epi16(y0, y1); + x1 = _mm_sub_epi16(y0, y1); - a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); - b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); - x0 = _mm_packs_epi32(b0, b1); - x1 = _mm_packs_epi32(b2, b3); + x0 = _mm_packs_epi32(b0, b1); + x1 = _mm_packs_epi32(b2, b3); - y0 = _mm_unpacklo_epi16(x0, x1); + y0 = _mm_unpacklo_epi16(x0, x1); - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0);//TODO change to 64bit - } + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0);//TODO change to 64bit + } } static void PfreqN4FirstTranspose16_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - for (i = 0; i < 2; i++) - { - for (j = 0; j < 1; j++) - { - __m128i a0, a1, a2, a3, a4, a5, a6, a7; - __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; - - a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); - a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); - a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); - a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); - a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); - a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); - a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); - a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); - - b0 = _mm_unpacklo_epi16(a0, a4); - b1 = _mm_unpacklo_epi16(a1, a5); - b2 = _mm_unpacklo_epi16(a2, a6); - b3 = _mm_unpacklo_epi16(a3, a7); - // b4 = _mm_unpackhi_epi16(a0, a4); - // b5 = _mm_unpackhi_epi16(a1, a5); - // b6 = _mm_unpackhi_epi16(a2, a6); - // b7 = _mm_unpackhi_epi16(a3, a7); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - // a4 = _mm_unpacklo_epi16(b4, b6); - // a5 = _mm_unpacklo_epi16(b5, b7); - // a6 = _mm_unpackhi_epi16(b4, b6); - // a7 = _mm_unpackhi_epi16(b5, b7); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - // b4 = _mm_unpacklo_epi16(a4, a5); - // b5 = _mm_unpackhi_epi16(a4, a5); - // b6 = _mm_unpacklo_epi16(a6, a7); - // b7 = _mm_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); - } - } + EB_U32 i, j; + for (i = 0; i < 2; i++) + { + for (j = 0; j < 1; j++) + { + __m128i a0, a1, a2, a3, a4, a5, a6, a7; + __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; + + a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); + a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); + a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); + a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); + a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); + a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); + a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); + a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); + + b0 = _mm_unpacklo_epi16(a0, a4); + b1 = _mm_unpacklo_epi16(a1, a5); + b2 = _mm_unpacklo_epi16(a2, a6); + b3 = _mm_unpacklo_epi16(a3, a7); + // b4 = _mm_unpackhi_epi16(a0, a4); + // b5 = _mm_unpackhi_epi16(a1, a5); + // b6 = _mm_unpackhi_epi16(a2, a6); + // b7 = _mm_unpackhi_epi16(a3, a7); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + // a4 = _mm_unpacklo_epi16(b4, b6); + // a5 = _mm_unpacklo_epi16(b5, b7); + // a6 = _mm_unpackhi_epi16(b4, b6); + // a7 = _mm_unpackhi_epi16(b5, b7); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + // b4 = _mm_unpacklo_epi16(a4, a5); + // b5 = _mm_unpackhi_epi16(a4, a5); + // b6 = _mm_unpacklo_epi16(a6, a7); + // b7 = _mm_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); + } + } } static void PfreqN4SecondTranspose16_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - - i = j = 0; - { - { - __m128i a0, a1, a2, a3/*, a4, a5, a6, a7*/; - __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; - - a0 = _mm_loadu_si128((const __m128i *)(src + (0)*src_stride)); //TODO load only 64bit - a1 = _mm_loadu_si128((const __m128i *)(src + (1)*src_stride)); - a2 = _mm_loadu_si128((const __m128i *)(src + (2)*src_stride)); - a3 = _mm_loadu_si128((const __m128i *)(src + (3)*src_stride)); - - b0 = _mm_unpacklo_epi16(a0, a0/*a4*/); - b1 = _mm_unpacklo_epi16(a1, a1/*a5*/); - b2 = _mm_unpacklo_epi16(a2, a2/*a6*/); - b3 = _mm_unpacklo_epi16(a3, a3/*a7*/); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - } - } + EB_U32 i, j; + + i = j = 0; + { + { + __m128i a0, a1, a2, a3/*, a4, a5, a6, a7*/; + __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; + + a0 = _mm_loadu_si128((const __m128i *)(src + (0)*src_stride)); //TODO load only 64bit + a1 = _mm_loadu_si128((const __m128i *)(src + (1)*src_stride)); + a2 = _mm_loadu_si128((const __m128i *)(src + (2)*src_stride)); + a3 = _mm_loadu_si128((const __m128i *)(src + (3)*src_stride)); + + b0 = _mm_unpacklo_epi16(a0, a0/*a4*/); + b1 = _mm_unpacklo_epi16(a1, a1/*a5*/); + b2 = _mm_unpacklo_epi16(a2, a2/*a6*/); + b3 = _mm_unpacklo_epi16(a3, a3/*a7*/); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + } + } } void PfreqTransform32x32_SSE2( @@ -2481,19 +2481,19 @@ void PfreqTransform32x32_SSE2( } void PfreqN4Transform16x16_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) { - Pfreq1DTransform16_SSE2(src, src_stride, intermediate, 16, 4 + addshift); - PfreqN4FirstTranspose16_SSE2(intermediate, 16, dst, dst_stride); - PfreqN42DTransform16_SSE2(dst, dst_stride, intermediate, 16, 9); - PfreqN4SecondTranspose16_SSE2(intermediate, 16, dst, dst_stride); + Pfreq1DTransform16_SSE2(src, src_stride, intermediate, 16, 4 + addshift); + PfreqN4FirstTranspose16_SSE2(intermediate, 16, dst, dst_stride); + PfreqN42DTransform16_SSE2(dst, dst_stride, intermediate, 16, 9); + PfreqN4SecondTranspose16_SSE2(intermediate, 16, dst, dst_stride); - return; + return; } @@ -2535,12 +2535,12 @@ void Transform4x4_SSE2_INTRIN( xmm3 = _mm_loadl_epi64((__m128i *)(residual + 3 * srcStride)); xmm0 = _mm_unpacklo_epi16(xmm0, xmm1); xmm2 = _mm_unpacklo_epi16(xmm2, xmm3); - + xmm1 = _mm_unpackhi_epi32(xmm0, xmm2); xmm0 = _mm_unpacklo_epi32(xmm0, xmm2); xmm1 = _mm_unpacklo_epi64(_mm_srli_si128(xmm1, 8), xmm1); xmm3 = _mm_sub_epi16(xmm0, xmm1); - xmm0 = _mm_add_epi16(xmm0, xmm1); + xmm0 = _mm_add_epi16(xmm0, xmm1); xmm4 = xmm2 = xmm0; xmm0 = _mm_srli_si128(xmm0, 8); @@ -2551,7 +2551,7 @@ void Transform4x4_SSE2_INTRIN( xmm_shift = _mm_cvtsi32_si128(bitIncrement + 1); xmm1 = _mm_unpacklo_epi16(xmm3, _mm_srli_si128(xmm3, 8)); - + xmm3 = _mm_madd_epi16(xmm1, _mm_load_si128((__m128i *)(transformIntrinConst_SSE2 + OFFSET_36_N83))); xmm1 = _mm_madd_epi16(xmm1, _mm_load_si128((__m128i *)(transformIntrinConst_SSE2 + OFFSET_83_36))); xmm1 = _mm_add_epi32(xmm1, xmm_offset); @@ -2577,14 +2577,14 @@ void Transform4x4_SSE2_INTRIN( (void)transformCoefficients; (void)transformInnerArrayPtr; -#undef OFFSET_128 -#undef OFFSET_64_64 -#undef OFFSET_83_36 +#undef OFFSET_128 +#undef OFFSET_64_64 +#undef OFFSET_83_36 #undef OFFSET_N36_N83 -#undef OFFSET_64_N64 -#undef OFFSET_N64_64 -#undef OFFSET_36_N83 -#undef OFFSET_83_N36 +#undef OFFSET_64_N64 +#undef OFFSET_N64_64 +#undef OFFSET_36_N83 +#undef OFFSET_83_N36 } void DstTransform4x4_SSE2_INTRIN( @@ -2619,7 +2619,7 @@ void DstTransform4x4_SSE2_INTRIN( xmm_res2 = _mm_loadl_epi64((__m128i *)(residual + 2 * srcStride)); xmm_res3 = _mm_loadl_epi64((__m128i *)(residual + 3 * srcStride)); xmm_offset = _mm_srli_epi32(_mm_slli_epi32(_mm_load_si128((__m128i *)(DstTransformAsmConst_SSE2 + OFFSET_DST_1)), shift), 1); - + xmm_res0_1 = _mm_unpacklo_epi32(xmm_res0, xmm_res1); // |res01 |res-S1-01|res23 |res-S1-23| xmm_res2_3 = _mm_unpacklo_epi32(xmm_res2, xmm_res3); // |res-S2-01|res-S3-01|res-S2-23|res-S3-23| xmm_res_hi = _mm_unpackhi_epi64(xmm_res0_1, xmm_res2_3); // |res23 |res-S1-23|res-S2-23|res-S3-23| @@ -2629,7 +2629,7 @@ void DstTransform4x4_SSE2_INTRIN( MACRO_TRANS_2MAC_NO_SAVE(xmm_res_lo, xmm_res_hi, xmm_trans1, xmm_temp, xmm_offset, OFFSET_DST_74_74, OFFSET_DST_0_N74, shift) MACRO_TRANS_2MAC_NO_SAVE(xmm_res_lo, xmm_res_hi, xmm_trans2, xmm_temp, xmm_offset, OFFSET_DST_84_N29, OFFSET_DST_N74_55, shift) MACRO_TRANS_2MAC_NO_SAVE(xmm_res_lo, xmm_res_hi, xmm_trans3, xmm_temp, xmm_offset, OFFSET_DST_55_N84, OFFSET_DST_74_N29, shift) - + // Second Partial Bufferfly xmm_offset = _mm_set1_epi32(0x00000080); // 128 xmm_trans0_1 = _mm_unpacklo_epi32(xmm_trans0, xmm_trans1); @@ -2641,7 +2641,7 @@ void DstTransform4x4_SSE2_INTRIN( MACRO_TRANS_2MAC(xmm_trans_lo, xmm_trans_hi, xmm_trans1, xmm_temp, xmm_offset, OFFSET_DST_74_74, OFFSET_DST_0_N74, 8, dstStride) MACRO_TRANS_2MAC(xmm_trans_lo, xmm_trans_hi, xmm_trans2, xmm_temp, xmm_offset, OFFSET_DST_84_N29, OFFSET_DST_N74_55, 8, (2 * dstStride)) MACRO_TRANS_2MAC(xmm_trans_lo, xmm_trans_hi, xmm_trans3, xmm_temp, xmm_offset, OFFSET_DST_55_N84, OFFSET_DST_74_N29, 8, (3 * dstStride)) - + (void)transformInnerArrayPtr; } @@ -2656,7 +2656,7 @@ void Transform8x8_SSE2_INTRIN( // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth // Use a smaller table with values just for Transform8x8. - EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { + EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { 83, 36, 83, 36, 83, 36, 83, 36, 36, -83, 36, -83, 36, -83, 36, -83, 89, 75, 89, 75, 89, 75, 89, 75, @@ -2676,15 +2676,15 @@ void Transform8x8_SSE2_INTRIN( 36, 83, 36, 83, 36, 83, 36, 83, 50, 89, 50, 89, 50, 89, 50, 89, 18, -75, 18, -75, 18, -75, 18, -75, - -64, 64, -64, 64, -64, 64, -64, 64, + -64, 64, -64, 64, -64, 64, -64, 64, 64, -64, 64, -64, 64, -64, 64, -64, -75, -18, -75, -18, -75, -18, -75, -18, 89, -50, 89, -50, 89, -50, 89, -50, - 83, -36, 83, -36, 83, -36, 83, -36, - -36, 83, -36, 83, -36, 83, -36, 83, - -83, 36, -83, 36, -83, 36, -83, 36, + 83, -36, 83, -36, 83, -36, 83, -36, + -36, 83, -36, 83, -36, 83, -36, 83, + -83, 36, -83, 36, -83, 36, -83, 36, 89, -75, 89, -75, 89, -75, 89, -75, - 50, -18, 50, -18, 50, -18, 50, -18, + 50, -18, 50, -18, 50, -18, 50, -18, }; __m128i sum, sum1, sum2, sum3, sum4; __m128i res0, res1, res2, res3, res4, res5, res6, res7; @@ -2711,7 +2711,7 @@ void Transform8x8_SSE2_INTRIN( MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) - + evenEven0 = _mm_add_epi16(even0, even3); evenEven1 = _mm_add_epi16(even1, even2); evenOdd0 = _mm_sub_epi16(even0, even3); @@ -2719,7 +2719,7 @@ void Transform8x8_SSE2_INTRIN( shift = 4 - bitIncrement; trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); - trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); + trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); shift = bitIncrement + 2; @@ -2729,13 +2729,13 @@ void Transform8x8_SSE2_INTRIN( trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)),_mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)),_mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - + // TransformCoefficients 1, 3, 5, 7 odd01_lo = _mm_unpacklo_epi16(odd0, odd1); odd01_hi = _mm_unpackhi_epi16(odd0, odd1); odd23_lo = _mm_unpacklo_epi16(odd2, odd3); odd23_hi = _mm_unpackhi_epi16(odd2, odd3); - + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) @@ -2745,245 +2745,245 @@ void Transform8x8_SSE2_INTRIN( MACRO_UNPACK(64, trans0, trans2, trans01, trans23, trans4, trans6, trans45, trans67, trans02, trans0123, trans46, trans4567) xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); - + MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - transformCoefficients += 4 * dstStride; + transformCoefficients += 4 * dstStride; MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - + (void)transformInnerArrayPtr; } void PfreqTransform8x8_SSE2_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { - // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth - // Use a smaller table with values just for Transform8x8. - - EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { - 83, 36, 83, 36, 83, 36, 83, 36, - 36, -83, 36, -83, 36, -83, 36, -83, - 89, 75, 89, 75, 89, 75, 89, 75, - 50, 18, 50, 18, 50, 18, 50, 18, - 75, -18, 75, -18, 75, -18, 75, -18, - -89, -50, -89, -50, -89, -50, -89, -50, - 50, -89, 50, -89, 50, -89, 50, -89, - 18, 75, 18, 75, 18, 75, 18, 75, - 18, -50, 18, -50, 18, -50, 18, -50, - 75, -89, 75, -89, 75, -89, 75, -89, - 256, 0, 256, 0, 256, 0, 256, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - -18, -50, -18, -50, -18, -50, -18, -50, - -75, -89, -75, -89, -75, -89, -75, -89, - -36, -83, -36, -83, -36, -83, -36, -83, - -83, -36, -83, -36, -83, -36, -83, -36, - 36, 83, 36, 83, 36, 83, 36, 83, - 50, 89, 50, 89, 50, 89, 50, 89, - 18, -75, 18, -75, 18, -75, 18, -75, - -64, 64, -64, 64, -64, 64, -64, 64, - 64, -64, 64, -64, 64, -64, 64, -64, - -75, -18, -75, -18, -75, -18, -75, -18, - 89, -50, 89, -50, 89, -50, 89, -50, - 83, -36, 83, -36, 83, -36, 83, -36, - -36, 83, -36, 83, -36, 83, -36, 83, - -83, 36, -83, 36, -83, 36, -83, 36, - 89, -75, 89, -75, 89, -75, 89, -75, - 50, -18, 50, -18, 50, -18, 50, -18, - }; - __m128i sum, sum1, sum2/*, sum3, sum4*/; - __m128i res0, res1, res2, res3, res4, res5, res6, res7; - __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; - __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; - __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; - __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; - __m128i trans02, trans0123; - __m128i xmm_offset; - EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; - EB_U32 shift; - - res0 = _mm_loadu_si128((__m128i *)residual); - res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - residual += (srcStride << 2); - res4 = _mm_loadu_si128((__m128i *)residual); - res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - - MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) - MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) - MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) - MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) - - evenEven0 = _mm_add_epi16(even0, even3); - evenEven1 = _mm_add_epi16(even1, even2); - evenOdd0 = _mm_sub_epi16(even0, even3); - evenOdd1 = _mm_sub_epi16(even1, even2); - - shift = 4 - bitIncrement; - trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); - trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); - - xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); - shift = bitIncrement + 2; - - trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - // TransformCoefficients 1, 3, 5, 7 - odd01_lo = _mm_unpacklo_epi16(odd0, odd1); - odd01_hi = _mm_unpackhi_epi16(odd0, odd1); - odd23_lo = _mm_unpacklo_epi16(odd2, odd3); - odd23_hi = _mm_unpackhi_epi16(odd2, odd3); - - MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) + // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth + // Use a smaller table with values just for Transform8x8. + + EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { + 83, 36, 83, 36, 83, 36, 83, 36, + 36, -83, 36, -83, 36, -83, 36, -83, + 89, 75, 89, 75, 89, 75, 89, 75, + 50, 18, 50, 18, 50, 18, 50, 18, + 75, -18, 75, -18, 75, -18, 75, -18, + -89, -50, -89, -50, -89, -50, -89, -50, + 50, -89, 50, -89, 50, -89, 50, -89, + 18, 75, 18, 75, 18, 75, 18, 75, + 18, -50, 18, -50, 18, -50, 18, -50, + 75, -89, 75, -89, 75, -89, 75, -89, + 256, 0, 256, 0, 256, 0, 256, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + -18, -50, -18, -50, -18, -50, -18, -50, + -75, -89, -75, -89, -75, -89, -75, -89, + -36, -83, -36, -83, -36, -83, -36, -83, + -83, -36, -83, -36, -83, -36, -83, -36, + 36, 83, 36, 83, 36, 83, 36, 83, + 50, 89, 50, 89, 50, 89, 50, 89, + 18, -75, 18, -75, 18, -75, 18, -75, + -64, 64, -64, 64, -64, 64, -64, 64, + 64, -64, 64, -64, 64, -64, 64, -64, + -75, -18, -75, -18, -75, -18, -75, -18, + 89, -50, 89, -50, 89, -50, 89, -50, + 83, -36, 83, -36, 83, -36, 83, -36, + -36, 83, -36, 83, -36, 83, -36, 83, + -83, 36, -83, 36, -83, 36, -83, 36, + 89, -75, 89, -75, 89, -75, 89, -75, + 50, -18, 50, -18, 50, -18, 50, -18, + }; + __m128i sum, sum1, sum2/*, sum3, sum4*/; + __m128i res0, res1, res2, res3, res4, res5, res6, res7; + __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; + __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; + __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; + __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; + __m128i trans02, trans0123; + __m128i xmm_offset; + EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; + EB_U32 shift; + + res0 = _mm_loadu_si128((__m128i *)residual); + res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + residual += (srcStride << 2); + res4 = _mm_loadu_si128((__m128i *)residual); + res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + + MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) + MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) + MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) + MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) + + evenEven0 = _mm_add_epi16(even0, even3); + evenEven1 = _mm_add_epi16(even1, even2); + evenOdd0 = _mm_sub_epi16(even0, even3); + evenOdd1 = _mm_sub_epi16(even1, even2); + + shift = 4 - bitIncrement; + trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); + trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); + + xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); + shift = bitIncrement + 2; + + trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + // TransformCoefficients 1, 3, 5, 7 + odd01_lo = _mm_unpacklo_epi16(odd0, odd1); + odd01_hi = _mm_unpackhi_epi16(odd0, odd1); + odd23_lo = _mm_unpacklo_epi16(odd2, odd3); + odd23_hi = _mm_unpackhi_epi16(odd2, odd3); + + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans7, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, shift) - - MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) - MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) - + + MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) + MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) + xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - //transformCoefficients += 4 * dstStride; - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - - (void)transformInnerArrayPtr; + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + //transformCoefficients += 4 * dstStride; + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + + (void)transformInnerArrayPtr; } void PfreqN4Transform8x8_SSE2_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { - // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth - // Use a smaller table with values just for Transform8x8. - - EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { - 83, 36, 83, 36, 83, 36, 83, 36, - 36, -83, 36, -83, 36, -83, 36, -83, - 89, 75, 89, 75, 89, 75, 89, 75, - 50, 18, 50, 18, 50, 18, 50, 18, - 75, -18, 75, -18, 75, -18, 75, -18, - -89, -50, -89, -50, -89, -50, -89, -50, - 50, -89, 50, -89, 50, -89, 50, -89, - 18, 75, 18, 75, 18, 75, 18, 75, - 18, -50, 18, -50, 18, -50, 18, -50, - 75, -89, 75, -89, 75, -89, 75, -89, - 256, 0, 256, 0, 256, 0, 256, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - -18, -50, -18, -50, -18, -50, -18, -50, - -75, -89, -75, -89, -75, -89, -75, -89, - -36, -83, -36, -83, -36, -83, -36, -83, - -83, -36, -83, -36, -83, -36, -83, -36, - 36, 83, 36, 83, 36, 83, 36, 83, - 50, 89, 50, 89, 50, 89, 50, 89, - 18, -75, 18, -75, 18, -75, 18, -75, - -64, 64, -64, 64, -64, 64, -64, 64, - 64, -64, 64, -64, 64, -64, 64, -64, - -75, -18, -75, -18, -75, -18, -75, -18, - 89, -50, 89, -50, 89, -50, 89, -50, - 83, -36, 83, -36, 83, -36, 83, -36, - -36, 83, -36, 83, -36, 83, -36, 83, - -83, 36, -83, 36, -83, 36, -83, 36, - 89, -75, 89, -75, 89, -75, 89, -75, - 50, -18, 50, -18, 50, -18, 50, -18, - }; - __m128i sum, sum1, sum2/*, sum3, sum4*/; - __m128i res0, res1, res2, res3, res4, res5, res6, res7; - __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; - __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; - __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; - __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; - __m128i trans02, trans0123; - __m128i xmm_offset; - EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; - EB_U32 shift; - - res0 = _mm_loadu_si128((__m128i *)residual); - res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - residual += (srcStride << 2); - res4 = _mm_loadu_si128((__m128i *)residual); - res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - - MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) - MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) - MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) - MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) - - evenEven0 = _mm_add_epi16(even0, even3); - evenEven1 = _mm_add_epi16(even1, even2); - evenOdd0 = _mm_sub_epi16(even0, even3); - evenOdd1 = _mm_sub_epi16(even1, even2); - - shift = 4 - bitIncrement; - trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); - trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); - - xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); - shift = bitIncrement + 2; - - trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - // TransformCoefficients 1, 3, 5, 7 - odd01_lo = _mm_unpacklo_epi16(odd0, odd1); - odd01_hi = _mm_unpackhi_epi16(odd0, odd1); - odd23_lo = _mm_unpacklo_epi16(odd2, odd3); - odd23_hi = _mm_unpackhi_epi16(odd2, odd3); - - MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) - MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) - //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) - //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans7, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, shift) - - MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) - MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) - - xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); - - MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - //transformCoefficients += 4 * dstStride; - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - - (void)transformInnerArrayPtr; + // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth + // Use a smaller table with values just for Transform8x8. + + EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { + 83, 36, 83, 36, 83, 36, 83, 36, + 36, -83, 36, -83, 36, -83, 36, -83, + 89, 75, 89, 75, 89, 75, 89, 75, + 50, 18, 50, 18, 50, 18, 50, 18, + 75, -18, 75, -18, 75, -18, 75, -18, + -89, -50, -89, -50, -89, -50, -89, -50, + 50, -89, 50, -89, 50, -89, 50, -89, + 18, 75, 18, 75, 18, 75, 18, 75, + 18, -50, 18, -50, 18, -50, 18, -50, + 75, -89, 75, -89, 75, -89, 75, -89, + 256, 0, 256, 0, 256, 0, 256, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + -18, -50, -18, -50, -18, -50, -18, -50, + -75, -89, -75, -89, -75, -89, -75, -89, + -36, -83, -36, -83, -36, -83, -36, -83, + -83, -36, -83, -36, -83, -36, -83, -36, + 36, 83, 36, 83, 36, 83, 36, 83, + 50, 89, 50, 89, 50, 89, 50, 89, + 18, -75, 18, -75, 18, -75, 18, -75, + -64, 64, -64, 64, -64, 64, -64, 64, + 64, -64, 64, -64, 64, -64, 64, -64, + -75, -18, -75, -18, -75, -18, -75, -18, + 89, -50, 89, -50, 89, -50, 89, -50, + 83, -36, 83, -36, 83, -36, 83, -36, + -36, 83, -36, 83, -36, 83, -36, 83, + -83, 36, -83, 36, -83, 36, -83, 36, + 89, -75, 89, -75, 89, -75, 89, -75, + 50, -18, 50, -18, 50, -18, 50, -18, + }; + __m128i sum, sum1, sum2/*, sum3, sum4*/; + __m128i res0, res1, res2, res3, res4, res5, res6, res7; + __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; + __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; + __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; + __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; + __m128i trans02, trans0123; + __m128i xmm_offset; + EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; + EB_U32 shift; + + res0 = _mm_loadu_si128((__m128i *)residual); + res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + residual += (srcStride << 2); + res4 = _mm_loadu_si128((__m128i *)residual); + res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + + MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) + MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) + MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) + MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) + + evenEven0 = _mm_add_epi16(even0, even3); + evenEven1 = _mm_add_epi16(even1, even2); + evenOdd0 = _mm_sub_epi16(even0, even3); + evenOdd1 = _mm_sub_epi16(even1, even2); + + shift = 4 - bitIncrement; + trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); + trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); + + xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); + shift = bitIncrement + 2; + + trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + // TransformCoefficients 1, 3, 5, 7 + odd01_lo = _mm_unpacklo_epi16(odd0, odd1); + odd01_hi = _mm_unpackhi_epi16(odd0, odd1); + odd23_lo = _mm_unpacklo_epi16(odd2, odd3); + odd23_hi = _mm_unpackhi_epi16(odd2, odd3); + + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) + //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) + //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans7, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, shift) + + MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) + MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) + + xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); + + MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + //transformCoefficients += 4 * dstStride; + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + + (void)transformInnerArrayPtr; } diff --git a/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h b/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h index 206d3bf0c..3e84a0f42 100644 --- a/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h @@ -130,12 +130,12 @@ void PfreqTransform16x16_SSE2( EB_U32 addshift); void PfreqN4Transform16x16_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift); + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift); void EstimateInvTransform32x32_SSE2( EB_S16 *transformCoefficients, diff --git a/Source/Lib/ASM_SSE2/x64Macro.asm b/Source/Lib/ASM_SSE2/x64Macro.asm index eaeeac61a..241301fa0 100644 --- a/Source/Lib/ASM_SSE2/x64Macro.asm +++ b/Source/Lib/ASM_SSE2/x64Macro.asm @@ -1,7 +1,7 @@ -; +; ; Copyright(c) 2018 Intel Corporation ; SPDX - License - Identifier: BSD - 2 - Clause - Patent -; +; %macro MACRO_INIT_MMX 3 mov %2, %3 diff --git a/Source/Lib/ASM_SSE2/x64RegisterUtil.asm b/Source/Lib/ASM_SSE2/x64RegisterUtil.asm index 295fb81c1..c193e8f32 100644 --- a/Source/Lib/ASM_SSE2/x64RegisterUtil.asm +++ b/Source/Lib/ASM_SSE2/x64RegisterUtil.asm @@ -1,7 +1,7 @@ -; +; ; Copyright(c) 2018 Intel Corporation ; SPDX - License - Identifier: BSD - 2 - Clause - Patent -; +; %include "x64inc.asm" diff --git a/Source/Lib/ASM_SSE2/x64inc.asm b/Source/Lib/ASM_SSE2/x64inc.asm index 4440b060b..d0efbf9aa 100644 --- a/Source/Lib/ASM_SSE2/x64inc.asm +++ b/Source/Lib/ASM_SSE2/x64inc.asm @@ -1,7 +1,7 @@ -; +; ; Copyright(c) 2018 Intel Corporation ; SPDX - License - Identifier: BSD - 2 - Clause - Patent -; +; %ifdef PREFIX %define mangle(x) _ %+ x @@ -310,7 +310,7 @@ bits 64 ADD_RSP 16 movdqu xmm11, [rsp] ADD_RSP 16 - movdqu xmm10, [rsp] + movdqu xmm10, [rsp] ADD_RSP 16 movdqu xmm9, [rsp] ADD_RSP 16 diff --git a/Source/Lib/ASM_SSE4_1/EbIntraPrediction_SSE4_1.h b/Source/Lib/ASM_SSE4_1/EbIntraPrediction_SSE4_1.h index 338707bae..354cff9ef 100644 --- a/Source/Lib/ASM_SSE4_1/EbIntraPrediction_SSE4_1.h +++ b/Source/Lib/ASM_SSE4_1/EbIntraPrediction_SSE4_1.h @@ -22,4 +22,4 @@ extern void IntraModeDCLuma16bit_SSE4_1_INTRIN( #ifdef __cplusplus } #endif -#endif // EbIntraPrediction_SSE4_1_h \ No newline at end of file +#endif // EbIntraPrediction_SSE4_1_h diff --git a/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c b/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c index 8205f95f3..43343ae5b 100644 --- a/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c +++ b/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c @@ -248,248 +248,248 @@ EB_U64 Compute8x8Satd_SSE4( } EB_U64 Compute8x8Satd_U8_SSE4( - EB_U8 *src, // input parameter, diff samples Ptr - EB_U64 *dcValue, - EB_U32 srcStride) + EB_U8 *src, // input parameter, diff samples Ptr + EB_U64 *dcValue, + EB_U32 srcStride) { - EB_U64 satdBlock8x8 = 0; - EB_S16 m2[8][8]; - - EB_U32 j; - __m128i s0, s1, s2, s3, s4, s5, s6, s7, s9, s10, s11, s12; - __m128i s8 = _mm_setzero_si128(); - __m128i sum01Neg, sum01Pos, sum23Neg, sum23Pos, sum45Neg, sum45Pos, sum67Neg, sum67Pos; - __m128i sum0to3Pos, sum4to7Pos, sum0to3Neg, sum4to7Neg, diff0to3Pos, diff4to7Pos, diff0to3Neg, diff4to7Neg; - __m128i sum0, sum1, difference0, difference1; - - for (j = 0; j < 8; j += 2) - { - s0 = _mm_loadl_epi64((__m128i*)(src + (j *srcStride))); - s10 = _mm_loadl_epi64((__m128i*)(src + ((j + 1) *srcStride))); - s10 = _mm_unpacklo_epi8(s10, _mm_setzero_si128()); - s0 = _mm_unpacklo_epi8(s0, _mm_setzero_si128()); - - sum0 = _mm_hadd_epi16(s0, s8); - sum1 = _mm_hadd_epi16(s10, s8); - - difference0 = _mm_hsub_epi16(s0, s8); - difference1 = _mm_hsub_epi16(s10, s8); - - // m2[j][0] - // diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] + diff[jj + 1] + diff[jj + 5] + diff[jj + 3] + diff[jj + 7] - // diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] + diff[jj + 4] + diff[jj + 5] + diff[jj + 6] + diff[jj + 7] - s1 = _mm_hadd_epi16(sum0, sum1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][0] = _mm_extract_epi16(s1, 0); - m2[j + 1][0] = _mm_extract_epi16(s1, 2); - - - //m2[j][1] - //diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] - diff[jj + 1] - diff[jj + 5] - diff[jj + 3] - diff[jj + 7] - //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] + diff[jj + 4] - diff[jj + 5] + diff[jj + 6] - diff[jj + 7] - //(diff[jj] - diff[jj + 1]) + (diff[jj + 2] - diff[jj + 3]) + (diff[jj + 4] - diff[jj + 5]) + (diff[jj + 6] - diff[jj + 7]) - s1 = _mm_hadd_epi16(difference0, difference1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][1] = _mm_extract_epi16(s1, 0); - m2[j + 1][1] = _mm_extract_epi16(s1, 2); - - //m2[j][2] - //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] + diff[jj + 1] + diff[jj + 5] - diff[jj + 3] - diff[jj + 7] - //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] + diff[jj + 4] + diff[jj + 5] - diff[jj + 6] - diff[jj + 7] - s1 = _mm_hsub_epi16(sum0, sum1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][2] = _mm_extract_epi16(s1, 0); - m2[j + 1][2] = _mm_extract_epi16(s1, 2); - - //m2[j][3] - //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] - diff[jj + 1] - diff[jj + 5] + diff[jj + 3] + diff[jj + 7] - //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] - //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] - s1 = _mm_hsub_epi16(difference0, difference1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][3] = _mm_extract_epi16(s1, 0); - m2[j + 1][3] = _mm_extract_epi16(s1, 2); - - //m2[j][4] - //diff[jj] - diff[jj + 4] + diff[jj + 2] - diff[jj + 6] + diff[jj + 1] - diff[jj + 5] + diff[jj + 3] - diff[jj + 7] - //diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] - diff[jj + 4] - diff[jj + 5] - diff[jj + 6] - diff[jj + 7] - s1 = _mm_hadd_epi16(sum0, sum1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][4] = _mm_extract_epi16(s1, 0); - m2[j + 1][4] = _mm_extract_epi16(s1, 2); - - //m2[j][5] - //m1[j][4] - m1[j][5] - //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] - diff[jj + 4] + diff[jj + 5] - diff[jj + 6] + diff[jj + 7] - s1 = _mm_hadd_epi16(difference0, difference1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][5] = _mm_extract_epi16(s1, 0); - m2[j + 1][5] = _mm_extract_epi16(s1, 2); - - //m2[j][6] - //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] + diff[jj + 1] - diff[jj + 5] - diff[jj + 3] + diff[jj + 7] - //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] - diff[jj + 4] - diff[jj + 5] + diff[jj + 6] + diff[jj + 7] - - s1 = _mm_hsub_epi16(sum0, sum1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][6] = _mm_extract_epi16(s1, 0); - m2[j + 1][6] = _mm_extract_epi16(s1, 2); - - //m2[j][7] - //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] - diff[jj + 1] + diff[jj + 5] + diff[jj + 3] - diff[jj + 7] - //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] - diff[jj + 4] + diff[jj + 5] + diff[jj + 6] - diff[jj + 7] - s1 = _mm_hsub_epi16(difference0, difference1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][7] = _mm_extract_epi16(s1, 0); - m2[j + 1][7] = _mm_extract_epi16(s1, 2); - } - - // Vertical - s0 = _mm_loadu_si128((__m128i*)(m2[0])); - s1 = _mm_loadu_si128((__m128i*)(m2[1])); - s2 = _mm_loadu_si128((__m128i*)(m2[2])); - s3 = _mm_loadu_si128((__m128i*)(m2[3])); - s4 = _mm_loadu_si128((__m128i*)(m2[4])); - s5 = _mm_loadu_si128((__m128i*)(m2[5])); - s6 = _mm_loadu_si128((__m128i*)(m2[6])); - s7 = _mm_loadu_si128((__m128i*)(m2[7])); - - sum01Pos = _mm_add_epi16(s0, s1); - sum23Pos = _mm_add_epi16(s2, s3); - sum45Pos = _mm_add_epi16(s4, s5); - sum67Pos = _mm_add_epi16(s6, s7); - - sum01Neg = _mm_sub_epi16(s0, s1); - sum23Neg = _mm_sub_epi16(s2, s3); - sum45Neg = _mm_sub_epi16(s4, s5); - sum67Neg = _mm_sub_epi16(s6, s7); - - sum0to3Pos = _mm_add_epi16(sum01Pos, sum23Pos); - sum4to7Pos = _mm_add_epi16(sum45Pos, sum67Pos); - diff0to3Pos = _mm_sub_epi16(sum01Pos, sum23Pos); - diff4to7Pos = _mm_sub_epi16(sum45Pos, sum67Pos); - - sum0to3Neg = _mm_add_epi16(sum01Neg, sum23Neg); - sum4to7Neg = _mm_add_epi16(sum45Neg, sum67Neg); - diff0to3Neg = _mm_sub_epi16(sum01Neg, sum23Neg); - diff4to7Neg = _mm_sub_epi16(sum45Neg, sum67Neg); - - //m2[0][i] = m1[0][i] + m1[1][i] - //m2[0][i] = m3[0][i] + m3[2][i] + m3[1][i] + m3[3][i] - //m2[0][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] + m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i] - //m2[0][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] + m2[4][i] + m2[5][i] + m2[6][i] + m2[7][i] - s9 = _mm_add_epi16(sum0to3Pos, sum4to7Pos); - s9 = _mm_abs_epi16(s9); - *dcValue += _mm_extract_epi16(s9, 0); - - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - - - //m2[1][i] = m1[0][i] - m1[1][i] - //m2[1][i] = m3[0][i] + m3[2][i] -(m3[1][i] + m3[3][i]) - //m2[1][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] -(m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i]) - //m2[1][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] + m2[4][i] - m2[5][i] + m2[6][i] - m2[7][i] - s9 = _mm_add_epi16(sum0to3Neg, sum4to7Neg); - s9 = _mm_abs_epi16(s9); - s12 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s12 = _mm_add_epi32(s12, s11); - s12 = _mm_hadd_epi32(s12, s8); - s12 = _mm_hadd_epi32(s12, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[2][i] = m1[2][i] + m1[3][i] - //m2[2][i] = m3[0][i] - m3[2][i] + m3[1][i] - m3[3][i] - //m2[2][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) + m2[1][i] + m2[5][i] - (m2[3][i] + m2[7][i]) - //m2[2][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] + m2[4][i] + m2[5][i] - m2[6][i] - m2[7][i] - //m2[2][i] = m2[0][i] + m2[1][i] - (m2[2][i] + m2[3][i]) + m2[4][i] + m2[5][i] - (m2[6][i] + m2[7][i]) - s9 = _mm_add_epi16(diff0to3Pos, diff4to7Pos); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[3][i] = m1[2][i] - m1[3][i] - //m2[3][i] = m3[0][i] - m3[2][i] - (m3[1][i] - m3[3][i]) - //m2[3][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) - (m2[1][i] + m2[5][i] - m2[3][i] - m2[7][i]) - //m2[3][i] = m2[0][i] - m2[1][i] - m2[2][i] + m2[3][i] + m2[4][i] - m2[5][i] - m2[6][i] + m2[7][i] - //m2[3][i] = m2[0][i] - m2[1][i] - (m2[2][i] - m2[3][i]) + (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) - s9 = _mm_add_epi16(diff0to3Neg, diff4to7Neg); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[4][i] = m1[4][i] + m1[5][i] - //m2[4][i] = m3[4][i] + m3[6][i] + m3[5][i] + m3[7][i] - //m2[4][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] + m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i] - //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - m2[4][i] - m2[5][i] - m2[6][i] - m2[7][i] - //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - ( (m2[4][i] + m2[5][i]) + (m2[6][i] + m2[7][i]) ) - s9 = _mm_sub_epi16(sum0to3Pos, sum4to7Pos); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[5][i] = m1[4][i] - m1[5][i] - //m2[5][i] = m3[4][i] + m3[6][i] - (m3[5][i] + m3[7][i]) - //m2[5][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] - (m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i]) - //m2[5][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] - m2[4][i] + m2[5][i] - m2[6][i] + m2[7][i] - //m2[5][i] = m2[0][i] - m2[1][i] + (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) + (m2[6][i] - m2[7][i]) ) - s9 = _mm_sub_epi16(sum0to3Neg, sum4to7Neg); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[6][i] = m1[6][i] + m1[7][i] - //m2[6][i] = m3[4][i] - m3[6][i] + m3[5][i] - m3[7][i] - //m2[6][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) + m2[1][i] - m2[5][i] - (m2[3][i] - m2[7][i]) - //m2[6][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] - m2[4][i] - m2[5][i] + m2[6][i] + m2[7][i] - //m2[6][i] = (m2[0][i] + m2[1][i]) - (m2[2][i] + m2[3][i]) - ( (m2[4][i] + m2[5][i]) - (m2[6][i] + m2[7][i]) ) - s9 = _mm_sub_epi16(diff0to3Pos, diff4to7Pos); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[7][i] = m1[6][i] - m1[7][i] - //m2[7][i] = m3[4][i] - m3[6][i] - (m3[5][i] - m3[7][i]) - //m2[7][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) - ((m2[1][i] - m2[5][i]) - (m2[3][i] - m2[7][i])) - //m2[7][i] = (m2[0][i] - m2[1][i]) - (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) ) - s9 = _mm_sub_epi16(diff0to3Neg, diff4to7Neg); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - satdBlock8x8 = (EB_U64)_mm_extract_epi32(s12, 0); - - satdBlock8x8 = ((satdBlock8x8 + 2) >> 2); - - return satdBlock8x8; + EB_U64 satdBlock8x8 = 0; + EB_S16 m2[8][8]; + + EB_U32 j; + __m128i s0, s1, s2, s3, s4, s5, s6, s7, s9, s10, s11, s12; + __m128i s8 = _mm_setzero_si128(); + __m128i sum01Neg, sum01Pos, sum23Neg, sum23Pos, sum45Neg, sum45Pos, sum67Neg, sum67Pos; + __m128i sum0to3Pos, sum4to7Pos, sum0to3Neg, sum4to7Neg, diff0to3Pos, diff4to7Pos, diff0to3Neg, diff4to7Neg; + __m128i sum0, sum1, difference0, difference1; + + for (j = 0; j < 8; j += 2) + { + s0 = _mm_loadl_epi64((__m128i*)(src + (j *srcStride))); + s10 = _mm_loadl_epi64((__m128i*)(src + ((j + 1) *srcStride))); + s10 = _mm_unpacklo_epi8(s10, _mm_setzero_si128()); + s0 = _mm_unpacklo_epi8(s0, _mm_setzero_si128()); + + sum0 = _mm_hadd_epi16(s0, s8); + sum1 = _mm_hadd_epi16(s10, s8); + + difference0 = _mm_hsub_epi16(s0, s8); + difference1 = _mm_hsub_epi16(s10, s8); + + // m2[j][0] + // diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] + diff[jj + 1] + diff[jj + 5] + diff[jj + 3] + diff[jj + 7] + // diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] + diff[jj + 4] + diff[jj + 5] + diff[jj + 6] + diff[jj + 7] + s1 = _mm_hadd_epi16(sum0, sum1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][0] = _mm_extract_epi16(s1, 0); + m2[j + 1][0] = _mm_extract_epi16(s1, 2); + + + //m2[j][1] + //diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] - diff[jj + 1] - diff[jj + 5] - diff[jj + 3] - diff[jj + 7] + //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] + diff[jj + 4] - diff[jj + 5] + diff[jj + 6] - diff[jj + 7] + //(diff[jj] - diff[jj + 1]) + (diff[jj + 2] - diff[jj + 3]) + (diff[jj + 4] - diff[jj + 5]) + (diff[jj + 6] - diff[jj + 7]) + s1 = _mm_hadd_epi16(difference0, difference1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][1] = _mm_extract_epi16(s1, 0); + m2[j + 1][1] = _mm_extract_epi16(s1, 2); + + //m2[j][2] + //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] + diff[jj + 1] + diff[jj + 5] - diff[jj + 3] - diff[jj + 7] + //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] + diff[jj + 4] + diff[jj + 5] - diff[jj + 6] - diff[jj + 7] + s1 = _mm_hsub_epi16(sum0, sum1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][2] = _mm_extract_epi16(s1, 0); + m2[j + 1][2] = _mm_extract_epi16(s1, 2); + + //m2[j][3] + //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] - diff[jj + 1] - diff[jj + 5] + diff[jj + 3] + diff[jj + 7] + //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] + //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] + s1 = _mm_hsub_epi16(difference0, difference1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][3] = _mm_extract_epi16(s1, 0); + m2[j + 1][3] = _mm_extract_epi16(s1, 2); + + //m2[j][4] + //diff[jj] - diff[jj + 4] + diff[jj + 2] - diff[jj + 6] + diff[jj + 1] - diff[jj + 5] + diff[jj + 3] - diff[jj + 7] + //diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] - diff[jj + 4] - diff[jj + 5] - diff[jj + 6] - diff[jj + 7] + s1 = _mm_hadd_epi16(sum0, sum1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][4] = _mm_extract_epi16(s1, 0); + m2[j + 1][4] = _mm_extract_epi16(s1, 2); + + //m2[j][5] + //m1[j][4] - m1[j][5] + //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] - diff[jj + 4] + diff[jj + 5] - diff[jj + 6] + diff[jj + 7] + s1 = _mm_hadd_epi16(difference0, difference1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][5] = _mm_extract_epi16(s1, 0); + m2[j + 1][5] = _mm_extract_epi16(s1, 2); + + //m2[j][6] + //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] + diff[jj + 1] - diff[jj + 5] - diff[jj + 3] + diff[jj + 7] + //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] - diff[jj + 4] - diff[jj + 5] + diff[jj + 6] + diff[jj + 7] + + s1 = _mm_hsub_epi16(sum0, sum1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][6] = _mm_extract_epi16(s1, 0); + m2[j + 1][6] = _mm_extract_epi16(s1, 2); + + //m2[j][7] + //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] - diff[jj + 1] + diff[jj + 5] + diff[jj + 3] - diff[jj + 7] + //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] - diff[jj + 4] + diff[jj + 5] + diff[jj + 6] - diff[jj + 7] + s1 = _mm_hsub_epi16(difference0, difference1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][7] = _mm_extract_epi16(s1, 0); + m2[j + 1][7] = _mm_extract_epi16(s1, 2); + } + + // Vertical + s0 = _mm_loadu_si128((__m128i*)(m2[0])); + s1 = _mm_loadu_si128((__m128i*)(m2[1])); + s2 = _mm_loadu_si128((__m128i*)(m2[2])); + s3 = _mm_loadu_si128((__m128i*)(m2[3])); + s4 = _mm_loadu_si128((__m128i*)(m2[4])); + s5 = _mm_loadu_si128((__m128i*)(m2[5])); + s6 = _mm_loadu_si128((__m128i*)(m2[6])); + s7 = _mm_loadu_si128((__m128i*)(m2[7])); + + sum01Pos = _mm_add_epi16(s0, s1); + sum23Pos = _mm_add_epi16(s2, s3); + sum45Pos = _mm_add_epi16(s4, s5); + sum67Pos = _mm_add_epi16(s6, s7); + + sum01Neg = _mm_sub_epi16(s0, s1); + sum23Neg = _mm_sub_epi16(s2, s3); + sum45Neg = _mm_sub_epi16(s4, s5); + sum67Neg = _mm_sub_epi16(s6, s7); + + sum0to3Pos = _mm_add_epi16(sum01Pos, sum23Pos); + sum4to7Pos = _mm_add_epi16(sum45Pos, sum67Pos); + diff0to3Pos = _mm_sub_epi16(sum01Pos, sum23Pos); + diff4to7Pos = _mm_sub_epi16(sum45Pos, sum67Pos); + + sum0to3Neg = _mm_add_epi16(sum01Neg, sum23Neg); + sum4to7Neg = _mm_add_epi16(sum45Neg, sum67Neg); + diff0to3Neg = _mm_sub_epi16(sum01Neg, sum23Neg); + diff4to7Neg = _mm_sub_epi16(sum45Neg, sum67Neg); + + //m2[0][i] = m1[0][i] + m1[1][i] + //m2[0][i] = m3[0][i] + m3[2][i] + m3[1][i] + m3[3][i] + //m2[0][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] + m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i] + //m2[0][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] + m2[4][i] + m2[5][i] + m2[6][i] + m2[7][i] + s9 = _mm_add_epi16(sum0to3Pos, sum4to7Pos); + s9 = _mm_abs_epi16(s9); + *dcValue += _mm_extract_epi16(s9, 0); + + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + + + //m2[1][i] = m1[0][i] - m1[1][i] + //m2[1][i] = m3[0][i] + m3[2][i] -(m3[1][i] + m3[3][i]) + //m2[1][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] -(m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i]) + //m2[1][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] + m2[4][i] - m2[5][i] + m2[6][i] - m2[7][i] + s9 = _mm_add_epi16(sum0to3Neg, sum4to7Neg); + s9 = _mm_abs_epi16(s9); + s12 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s12 = _mm_add_epi32(s12, s11); + s12 = _mm_hadd_epi32(s12, s8); + s12 = _mm_hadd_epi32(s12, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[2][i] = m1[2][i] + m1[3][i] + //m2[2][i] = m3[0][i] - m3[2][i] + m3[1][i] - m3[3][i] + //m2[2][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) + m2[1][i] + m2[5][i] - (m2[3][i] + m2[7][i]) + //m2[2][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] + m2[4][i] + m2[5][i] - m2[6][i] - m2[7][i] + //m2[2][i] = m2[0][i] + m2[1][i] - (m2[2][i] + m2[3][i]) + m2[4][i] + m2[5][i] - (m2[6][i] + m2[7][i]) + s9 = _mm_add_epi16(diff0to3Pos, diff4to7Pos); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[3][i] = m1[2][i] - m1[3][i] + //m2[3][i] = m3[0][i] - m3[2][i] - (m3[1][i] - m3[3][i]) + //m2[3][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) - (m2[1][i] + m2[5][i] - m2[3][i] - m2[7][i]) + //m2[3][i] = m2[0][i] - m2[1][i] - m2[2][i] + m2[3][i] + m2[4][i] - m2[5][i] - m2[6][i] + m2[7][i] + //m2[3][i] = m2[0][i] - m2[1][i] - (m2[2][i] - m2[3][i]) + (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) + s9 = _mm_add_epi16(diff0to3Neg, diff4to7Neg); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[4][i] = m1[4][i] + m1[5][i] + //m2[4][i] = m3[4][i] + m3[6][i] + m3[5][i] + m3[7][i] + //m2[4][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] + m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i] + //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - m2[4][i] - m2[5][i] - m2[6][i] - m2[7][i] + //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - ( (m2[4][i] + m2[5][i]) + (m2[6][i] + m2[7][i]) ) + s9 = _mm_sub_epi16(sum0to3Pos, sum4to7Pos); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[5][i] = m1[4][i] - m1[5][i] + //m2[5][i] = m3[4][i] + m3[6][i] - (m3[5][i] + m3[7][i]) + //m2[5][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] - (m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i]) + //m2[5][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] - m2[4][i] + m2[5][i] - m2[6][i] + m2[7][i] + //m2[5][i] = m2[0][i] - m2[1][i] + (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) + (m2[6][i] - m2[7][i]) ) + s9 = _mm_sub_epi16(sum0to3Neg, sum4to7Neg); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[6][i] = m1[6][i] + m1[7][i] + //m2[6][i] = m3[4][i] - m3[6][i] + m3[5][i] - m3[7][i] + //m2[6][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) + m2[1][i] - m2[5][i] - (m2[3][i] - m2[7][i]) + //m2[6][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] - m2[4][i] - m2[5][i] + m2[6][i] + m2[7][i] + //m2[6][i] = (m2[0][i] + m2[1][i]) - (m2[2][i] + m2[3][i]) - ( (m2[4][i] + m2[5][i]) - (m2[6][i] + m2[7][i]) ) + s9 = _mm_sub_epi16(diff0to3Pos, diff4to7Pos); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[7][i] = m1[6][i] - m1[7][i] + //m2[7][i] = m3[4][i] - m3[6][i] - (m3[5][i] - m3[7][i]) + //m2[7][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) - ((m2[1][i] - m2[5][i]) - (m2[3][i] - m2[7][i])) + //m2[7][i] = (m2[0][i] - m2[1][i]) - (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) ) + s9 = _mm_sub_epi16(diff0to3Neg, diff4to7Neg); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + satdBlock8x8 = (EB_U64)_mm_extract_epi32(s12, 0); + + satdBlock8x8 = ((satdBlock8x8 + 2) >> 2); + + return satdBlock8x8; } EB_U64 SpatialFullDistortionKernel4x4_SSSE3_INTRIN( diff --git a/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h b/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h index 0851637a3..c8968cdc0 100644 --- a/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h +++ b/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h @@ -16,9 +16,9 @@ EB_U64 Compute8x8Satd_SSE4( EB_S16 *diff); // input parameter, diff samples Ptr EB_U64 Compute8x8Satd_U8_SSE4( - EB_U8 *src, // input parameter, diff samples Ptr - EB_U64 *dcValue, - EB_U32 srcStride); + EB_U8 *src, // input parameter, diff samples Ptr + EB_U64 *dcValue, + EB_U32 srcStride); EB_U64 SpatialFullDistortionKernel4x4_SSSE3_INTRIN( EB_U8 *input, diff --git a/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c b/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c index 46a0a68e1..7157bb5c2 100644 --- a/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c +++ b/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c @@ -97,7 +97,7 @@ void Transform8x8_SSE4_1_INTRIN( xmm_temp5 = _mm_srai_epi32(xmm_temp5, SHIFT);\ xmm_temp1 = _mm_packs_epi32(xmm_temp1, xmm_temp5);\ _mm_storeu_si128((__m128i *)(transformCoefficients+OFST5), xmm_temp1); - + __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans4, xmm_trans5, xmm_trans6, xmm_trans7; @@ -126,7 +126,7 @@ void Transform8x8_SSE4_1_INTRIN( MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) - + // TransformCoefficients 0, 2, 4, 6 xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); @@ -136,14 +136,14 @@ void Transform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); - xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); + xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); xmm_trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36_N83)),_mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36_N83)),_mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); - + // TransformCoefficients 1, 3, 5, 7 xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); @@ -170,7 +170,7 @@ void Transform8x8_SSE4_1_INTRIN( xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - + xmm_res0H = _mm_unpacklo_epi16(xmm_trans4, _mm_srai_epi16(xmm_trans4, 15)); xmm_res1H = _mm_unpackhi_epi16(xmm_trans4, _mm_srai_epi16(xmm_trans4, 15)); xmm_res2H = _mm_unpacklo_epi16(xmm_trans46_hi, _mm_srai_epi16(xmm_trans46_hi, 15)); @@ -197,18 +197,18 @@ void Transform8x8_SSE4_1_INTRIN( xmm_odd2H = _mm_sub_epi32(xmm_res2H, xmm_res5H); xmm_even3H = _mm_add_epi32(xmm_res3H, xmm_res4H); xmm_odd3H = _mm_sub_epi32(xmm_res3H, xmm_res4H); - + // TransformCoefficients 0, 4 xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); - + xmm_evenEven0H = _mm_add_epi32(xmm_even0H, xmm_even3H); xmm_evenEven1H = _mm_add_epi32(xmm_even1H, xmm_even2H); xmm_evenOdd0H = _mm_sub_epi32(xmm_even0H, xmm_even3H); xmm_evenOdd1H = _mm_sub_epi32(xmm_even1H, xmm_even2H); - + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); @@ -230,23 +230,23 @@ void Transform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), xmm_offset), 9), _mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd0H), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1H)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1H)), xmm_offset), 9)); _mm_storeu_si128((__m128i *)(transformCoefficients + 2 * dstStride), xmm_trans2); xmm_trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_sub_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1L)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1L)), xmm_offset), 9), _mm_srai_epi32(_mm_add_epi32(_mm_sub_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd0H), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1H)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1H)), xmm_offset), 9)); _mm_storeu_si128((__m128i *)(transformCoefficients + 6 * dstStride), xmm_trans6); - + // Transform Coefficients 1, 3, 5, 7 MACRO_TRANS_4MAC_PMULLD(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_odd0H, xmm_odd1H, xmm_odd2H, xmm_odd3H, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89, OFFSET_75, OFFSET_50, OFFSET_18, add_epi32, add_epi32, add_epi32, 9, dstStride) @@ -352,7 +352,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_temp5 = _mm_srai_epi32(xmm_temp5, SHIFT);\ xmm_temp1 = _mm_packs_epi32(xmm_temp1, xmm_temp5);\ _mm_storeu_si128((__m128i *)(transformCoefficients+OFST5), xmm_temp1); - + __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3; @@ -383,7 +383,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) - + // TransformCoefficients 0, 2, 4, 6 xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); @@ -393,12 +393,12 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); - //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); + //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); - + // TransformCoefficients 1, 3, 5, 7 xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); @@ -431,7 +431,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - + xmm_even0L = _mm_add_epi32(xmm_res0L, xmm_res7L); xmm_odd0L = _mm_sub_epi32(xmm_res0L, xmm_res7L); @@ -441,13 +441,13 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_odd2L = _mm_sub_epi32(xmm_res2L, xmm_res5L); xmm_even3L = _mm_add_epi32(xmm_res3L, xmm_res4L); xmm_odd3L = _mm_sub_epi32(xmm_res3L, xmm_res4L); - + // TransformCoefficients 0, 4 xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); - + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); @@ -459,7 +459,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), xmm_offset), 9), xmm_junk); @@ -474,12 +474,12 @@ void PfreqTransform8x8_SSE4_1_INTRIN( } void PfreqN4Transform8x8_SSE4_1_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { #define OFFSET_2 0 #define OFFSET_4 (8+OFFSET_2) @@ -567,57 +567,57 @@ void PfreqN4Transform8x8_SSE4_1_INTRIN( xmm_temp1 = _mm_packs_epi32(xmm_temp1, xmm_temp5);\ _mm_storeu_si128((__m128i *)(transformCoefficients+OFST5), xmm_temp1); - __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; - __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; - __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3; - __m128i xmm_trans0_lo/*, xmm_trans4_lo, xmm_trans0_hi, xmm_trans4_hi*/; - __m128i xmm_even0, xmm_even1, xmm_even2, xmm_even3, xmm_odd0, xmm_odd1, xmm_odd2, xmm_odd3, xmm_evenEven0, xmm_evenEven1, xmm_evenOdd0, xmm_evenOdd1; - __m128i xmm_even0L, xmm_even1L, xmm_even2L, xmm_even3L, xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_evenEven0L, xmm_evenEven1L, xmm_evenOdd0L, xmm_evenOdd1L; - __m128i xmm_offset, xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi; - __m128i xmm_trans01_hi, xmm_trans23_hi, /*xmm_trans45_hi,*/ /*xmm_trans67_hi, */xmm_trans02_hi, xmm_trans01234_hi/*, xmm_trans46_hi, xmm_trans4567_hi*/; - __m128i xmm_res0L, xmm_res1L, xmm_res2L, xmm_res3L, xmm_res4L, xmm_res5L, xmm_res6L, xmm_res7L; - __m128i xmm_temp1, xmm_temp3/*, xmm_temp5, xmm_temp7*/; + __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; + __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; + __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3; + __m128i xmm_trans0_lo/*, xmm_trans4_lo, xmm_trans0_hi, xmm_trans4_hi*/; + __m128i xmm_even0, xmm_even1, xmm_even2, xmm_even3, xmm_odd0, xmm_odd1, xmm_odd2, xmm_odd3, xmm_evenEven0, xmm_evenEven1, xmm_evenOdd0, xmm_evenOdd1; + __m128i xmm_even0L, xmm_even1L, xmm_even2L, xmm_even3L, xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_evenEven0L, xmm_evenEven1L, xmm_evenOdd0L, xmm_evenOdd1L; + __m128i xmm_offset, xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi; + __m128i xmm_trans01_hi, xmm_trans23_hi, /*xmm_trans45_hi,*/ /*xmm_trans67_hi, */xmm_trans02_hi, xmm_trans01234_hi/*, xmm_trans46_hi, xmm_trans4567_hi*/; + __m128i xmm_res0L, xmm_res1L, xmm_res2L, xmm_res3L, xmm_res4L, xmm_res5L, xmm_res6L, xmm_res7L; + __m128i xmm_temp1, xmm_temp3/*, xmm_temp5, xmm_temp7*/; - __m128i xmm_junk = _mm_setzero_si128(); //set to zero to avoid valgrind issue + __m128i xmm_junk = _mm_setzero_si128(); //set to zero to avoid valgrind issue - xmm_res0 = _mm_loadu_si128((__m128i *)(residual)); - xmm_res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - xmm_res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - xmm_res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - residual += 4 * srcStride; - xmm_res4 = _mm_loadu_si128((__m128i *)(residual)); - xmm_res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - xmm_res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - xmm_res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + xmm_res0 = _mm_loadu_si128((__m128i *)(residual)); + xmm_res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + xmm_res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + xmm_res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + residual += 4 * srcStride; + xmm_res4 = _mm_loadu_si128((__m128i *)(residual)); + xmm_res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + xmm_res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + xmm_res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - MACRO_UNPACK(16, xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi) - MACRO_UNPACK(32, xmm_res0, xmm_res2, xmm_res01_hi, xmm_res23_hi, xmm_res4, xmm_res6, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res0123_hi, xmm_res46_hi, xmm_res4567_hi) - MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) + MACRO_UNPACK(16, xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi) + MACRO_UNPACK(32, xmm_res0, xmm_res2, xmm_res01_hi, xmm_res23_hi, xmm_res4, xmm_res6, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res0123_hi, xmm_res46_hi, xmm_res4567_hi) + MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) - MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) + MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) - // TransformCoefficients 0, 2, 4, 6 - xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); - xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); - xmm_evenOdd0 = _mm_sub_epi16(xmm_even0, xmm_even3); - xmm_evenOdd1 = _mm_sub_epi16(xmm_even1, xmm_even2); + // TransformCoefficients 0, 2, 4, 6 + xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); + xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); + xmm_evenOdd0 = _mm_sub_epi16(xmm_even0, xmm_even3); + xmm_evenOdd1 = _mm_sub_epi16(xmm_even1, xmm_even2); - xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); - xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); - //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); + xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); + //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); - xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), - _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); + xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), + _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); - // TransformCoefficients 1, 3, 5, 7 - xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); - xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); - xmm_odd23_lo = _mm_unpacklo_epi16(xmm_odd2, xmm_odd3); - xmm_odd23_hi = _mm_unpackhi_epi16(xmm_odd2, xmm_odd3); + // TransformCoefficients 1, 3, 5, 7 + xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); + xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); + xmm_odd23_lo = _mm_unpacklo_epi16(xmm_odd2, xmm_odd3); + xmm_odd23_hi = _mm_unpackhi_epi16(xmm_odd2, xmm_odd3); - MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans1, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89_75, OFFSET_50_18, 2) - MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans3, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75_N18, OFFSET_N89_N50, 2) + MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans1, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89_75, OFFSET_50_18, 2) + MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans3, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75_N18, OFFSET_N89_N50, 2) #define MACRO_UNPACK_PF(ARG1, ARG2, ARG3, ARG4, ARG5, ARG10, ARG11)\ @@ -630,60 +630,60 @@ void PfreqN4Transform8x8_SSE4_1_INTRIN( /*ARG13 = _mm_unpackhi_epi##ARG1(ARG8, ARG9);*/\ /*ARG8 = _mm_unpacklo_epi##ARG1(ARG8, ARG9);*/ - MACRO_UNPACK_PF(16, xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans01_hi, xmm_trans23_hi) - MACRO_UNPACK_PF(32, xmm_trans0, xmm_trans2, xmm_trans01_hi, xmm_trans23_hi, xmm_trans02_hi, xmm_trans01234_hi) + MACRO_UNPACK_PF(16, xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans01_hi, xmm_trans23_hi) + MACRO_UNPACK_PF(32, xmm_trans0, xmm_trans2, xmm_trans01_hi, xmm_trans23_hi, xmm_trans02_hi, xmm_trans01234_hi) - //---- Second Partial Butterfly ---- + //---- Second Partial Butterfly ---- - // Calculate low and high - xmm_res0L = _mm_unpacklo_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); - xmm_res1L = _mm_unpackhi_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); - xmm_res2L = _mm_unpacklo_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); - xmm_res3L = _mm_unpackhi_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); - xmm_res4L = _mm_unpacklo_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); - xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); - xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); + // Calculate low and high + xmm_res0L = _mm_unpacklo_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); + xmm_res1L = _mm_unpackhi_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); + xmm_res2L = _mm_unpacklo_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); + xmm_res3L = _mm_unpackhi_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); + xmm_res4L = _mm_unpacklo_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); + xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); + xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); + xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - xmm_even0L = _mm_add_epi32(xmm_res0L, xmm_res7L); - xmm_odd0L = _mm_sub_epi32(xmm_res0L, xmm_res7L); - xmm_even1L = _mm_add_epi32(xmm_res1L, xmm_res6L); - xmm_odd1L = _mm_sub_epi32(xmm_res1L, xmm_res6L); - xmm_even2L = _mm_add_epi32(xmm_res2L, xmm_res5L); - xmm_odd2L = _mm_sub_epi32(xmm_res2L, xmm_res5L); - xmm_even3L = _mm_add_epi32(xmm_res3L, xmm_res4L); - xmm_odd3L = _mm_sub_epi32(xmm_res3L, xmm_res4L); + xmm_even0L = _mm_add_epi32(xmm_res0L, xmm_res7L); + xmm_odd0L = _mm_sub_epi32(xmm_res0L, xmm_res7L); + xmm_even1L = _mm_add_epi32(xmm_res1L, xmm_res6L); + xmm_odd1L = _mm_sub_epi32(xmm_res1L, xmm_res6L); + xmm_even2L = _mm_add_epi32(xmm_res2L, xmm_res5L); + xmm_odd2L = _mm_sub_epi32(xmm_res2L, xmm_res5L); + xmm_even3L = _mm_add_epi32(xmm_res3L, xmm_res4L); + xmm_odd3L = _mm_sub_epi32(xmm_res3L, xmm_res4L); - // TransformCoefficients 0, 4 - xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); - xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); - xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); - xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); + // TransformCoefficients 0, 4 + xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); + xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); + xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); + xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); - xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); - xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); - xmm_trans0_lo = _mm_packs_epi32(xmm_trans0_lo, xmm_trans0_lo); + xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); + xmm_trans0_lo = _mm_packs_epi32(xmm_trans0_lo, xmm_trans0_lo); - _mm_storel_epi64((__m128i *)(transformCoefficients), xmm_trans0_lo); + _mm_storel_epi64((__m128i *)(transformCoefficients), xmm_trans0_lo); - // TransformCoefficients 2, 6 - xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); + // TransformCoefficients 2, 6 + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); - xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)), xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)), xmm_evenOdd1L)), - xmm_offset), 9), + xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)), xmm_evenOdd0L), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)), xmm_evenOdd1L)), + xmm_offset), 9), - xmm_junk); + xmm_junk); - _mm_storeu_si128((__m128i *)(transformCoefficients + 2 * dstStride), xmm_trans2); + _mm_storeu_si128((__m128i *)(transformCoefficients + 2 * dstStride), xmm_trans2); - MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89, OFFSET_75, OFFSET_50, OFFSET_18, add_epi32, add_epi32, add_epi32, 9, dstStride) - MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75, OFFSET_18, OFFSET_89, OFFSET_50, sub_epi32, add_epi32, sub_epi32, 9, 3 * dstStride) + MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89, OFFSET_75, OFFSET_50, OFFSET_18, add_epi32, add_epi32, add_epi32, 9, dstStride) + MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75, OFFSET_18, OFFSET_89, OFFSET_50, sub_epi32, add_epi32, sub_epi32, 9, 3 * dstStride) - (void)bitIncrement; - (void)transformInnerArrayPtr; + (void)bitIncrement; + (void)transformInnerArrayPtr; } diff --git a/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h b/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h index bea33f205..039a06a8d 100644 --- a/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h +++ b/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h @@ -27,14 +27,14 @@ extern void PfreqTransform8x8_SSE4_1_INTRIN( EB_S16 *transformInnerArrayPtr, EB_U32 bitIncrement); extern void PfreqN4Transform8x8_SSE4_1_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement); + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement); #ifdef __cplusplus } #endif -#endif // EbTransforms_SSE4_1_h \ No newline at end of file +#endif // EbTransforms_SSE4_1_h diff --git a/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c index f4970c085..88c0e5fca 100644 --- a/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c @@ -22,13 +22,13 @@ EB_EXTERN EB_ALIGN(16) const EB_S8 AvcStyleLumaIFCoeff8_SSSE3[]= { void PictureCopyKernel_SSSE3( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight, - EB_U32 bytesPerSample); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight, + EB_U32 bytesPerSample); void AvcStyleLumaInterpolationFilterHorizontal_SSSE3_INTRIN( EB_BYTE refPic, @@ -122,7 +122,7 @@ void AvcStyleLumaInterpolationFilterVertical_SSSE3_INTRIN( if (!(puWidth & 15)) { //16x __m128i sum_lo, sum_hi, ref0, refs, ref2s, ref3s; - + for (width_cnt = 0; width_cnt < puWidth; width_cnt += 16) { refPicTemp = refPic; @@ -133,7 +133,7 @@ void AvcStyleLumaInterpolationFilterVertical_SSSE3_INTRIN( refs = _mm_loadu_si128((__m128i *)(refPicTemp + srcStride)); ref2s = _mm_loadu_si128((__m128i *)(refPicTemp + 2 * srcStride)); ref3s = _mm_loadu_si128((__m128i *)(refPicTemp + 3 * srcStride)); - + sum_lo = _mm_add_epi16(_mm_maddubs_epi16(_mm_unpacklo_epi8(ref0, refs), IFCoeff_1_0), _mm_maddubs_epi16(_mm_unpacklo_epi8(ref2s, ref3s), IFCoeff_3_2)); @@ -155,21 +155,21 @@ void AvcStyleLumaInterpolationFilterVertical_SSSE3_INTRIN( __m128i sum, sum01, sum23; for (width_cnt = 0; width_cnt < puWidth; width_cnt += 8) { - + refPicTemp = refPic; dstTemp = dst; - + for (height_cnt = 0; height_cnt < puHeight; ++height_cnt) { sum01 = _mm_maddubs_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refPicTemp)), _mm_loadl_epi64((__m128i *)(refPicTemp + srcStride))), IFCoeff_1_0); sum23 = _mm_maddubs_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refPicTemp + 2 * srcStride)), _mm_loadl_epi64((__m128i *)(refPicTemp + 3 * srcStride))), IFCoeff_3_2); - + sum = _mm_srai_epi16(_mm_add_epi16(_mm_add_epi16(sum01, sum23), IFOffset), IFShift); sum_clip_U8 = _mm_packus_epi16(sum, sum); _mm_storel_epi64((__m128i *)(dstTemp), sum_clip_U8); - + dstTemp += dstStride; refPicTemp += srcStrideSkip; } diff --git a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c index e4bde2413..430684d8b 100644 --- a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c @@ -12,13 +12,13 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( - EB_U8 *edgeStartSample, - EB_U32 reconLumaPicStride, - EB_BOOL isVerticalEdge, - EB_S32 tc, - EB_S32 beta) + EB_U8 *edgeStartSample, + EB_U32 reconLumaPicStride, + EB_BOOL isVerticalEdge, + EB_S32 tc, + EB_S32 beta) { - + __m128i x0, x1, x2, x3; __m128i d; __m128i e; @@ -76,23 +76,23 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( x3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); } - - + + // x0: p3 q3 // x1: p2 q2 // x2: p1 q1 // x3: p0 q0 - + // d: dp0 in lane 0, dp3 in lane 3, dq0 in lane 4, dq3 in lane 7 - + d = _mm_sub_epi16(x1, x2); d = _mm_sub_epi16(d, x2); d = _mm_add_epi16(d, x3); - + // Absolute value d = _mm_abs_epi16(d); - + // Need sum of lanes 0, 3, 4, 7 // e: d0=dp0+dq0 in lanes 0 and 4, d3=dp3+dq3 in lanes 3 and 7 e = _mm_add_epi16(d, _mm_shuffle_epi32(d, 0x4e)); // 0x4e = 01001110 @@ -100,49 +100,49 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( { return; } - + d32 = d; d32 = _mm_shufflelo_epi16(d32, 0xcc); // 0xcc = 11001100 d32 = _mm_shufflehi_epi16(d32, 0xcc); d32 = _mm_madd_epi16(d32, _mm_set1_epi16(1)); // d: dp=dp0+dp3 in lanes 0 and 1, dq=dq0+dq3 in lanes 2 and 3 (note: 32-bit lanes) - + tm = 0; tm += tc; tm += tc << 16; tcx = _mm_cvtsi32_si128(tm); tcx = _mm_unpacklo_epi16(tcx, tcx); tcx = _mm_shuffle_epi32(tcx, 0x50); // 01010000 - + x3r = _mm_shuffle_epi32(x3, 0x4e); // 0x4e = 01001110 (swap 64-bit lanes) f0 = _mm_max_epi16(_mm_sub_epi16(x0, x3), _mm_sub_epi16(x3, x0)); f0 = _mm_add_epi16(f0, _mm_shuffle_epi32(f0, 0x4e)); f0 = _mm_cmplt_epi16(f0, _mm_set1_epi16((short)(beta>>3))); - + f1 = _mm_max_epi16(_mm_sub_epi16(x3, x3r), _mm_sub_epi16(x3r, x3)); f1 = _mm_cmplt_epi16(f1, _mm_set1_epi16((short)((5*tc+1)>>1))); - + f2 = _mm_cmplt_epi16(_mm_add_epi16(e, e), _mm_set1_epi16((short)(beta >> 2))); - + f0 = _mm_and_si128(f0, f1); f0 = _mm_and_si128(f0, f2); - - + + y0 = x0; y1 = x1; y2 = x2; y3 = x3; strongFilter = (_mm_movemask_epi8(f0) & 0xc3) == 0xc3; - + if (strongFilter) { tcx2 = _mm_add_epi16(tcx, tcx); - + // q0 = p1 + 2p0 + 2q0 + 2q1 + q2 // q1 = p0 + q0 + q1 + q2 // q2 = p0 + q0 + q1 + 3q2 + 2q3 - + c0 = _mm_add_epi16(y0, y1); // q2 + q3 c1 = _mm_add_epi16(y1, y2); // q1 + q2 c2 = _mm_add_epi16(y2, y3); // q0 + q1 @@ -154,19 +154,19 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( y2 = _mm_add_epi16(c3, c1); c2 = _mm_add_epi16(c2, _mm_shuffle_epi32(c2, 0x4e)); - + y1 = _mm_add_epi16(y2, c0); y1 = _mm_add_epi16(y1, c0); y3 = _mm_add_epi16(y2, c2); - + y1 = _mm_add_epi16(y1, _mm_set1_epi16(4)); y2 = _mm_add_epi16(y2, _mm_set1_epi16(2)); y3 = _mm_add_epi16(y3, _mm_set1_epi16(4)); - + y1 = _mm_srai_epi16(y1, 3); y2 = _mm_srai_epi16(y2, 2); y3 = _mm_srai_epi16(y3, 3); - + y1 = _mm_max_epi16(y1, _mm_sub_epi16(x1, tcx2)); y1 = _mm_min_epi16(y1, _mm_add_epi16(x1, tcx2)); y2 = _mm_max_epi16(y2, _mm_sub_epi16(x2, tcx2)); @@ -181,31 +181,31 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( dl = _mm_sub_epi16(_mm_shuffle_epi32(dl, 0x4e), dl); dl = _mm_add_epi16(dl, _mm_setr_epi16(8, 8, 8, 8, 7, 7, 7, 7)); dl = _mm_srai_epi16(dl, 4); - + tcx10 = _mm_mullo_epi16(tcx, _mm_set1_epi16(10)); - + tcx = _mm_and_si128(tcx, _mm_cmplt_epi16(dl, tcx10)); tcx = _mm_and_si128(tcx, _mm_cmpgt_epi16(dl, _mm_sub_epi16(_mm_setzero_si128(), tcx10))); - + dl = _mm_min_epi16(dl, tcx); dl = _mm_max_epi16(dl, _mm_sub_epi16(_mm_setzero_si128(), tcx)); - + y3 = _mm_add_epi16(y3, dl); - + tcx = _mm_srai_epi16(tcx, 1); tcx = _mm_and_si128(tcx, _mm_cmplt_epi32(d32, _mm_set1_epi32(3*beta>>4))); // side threshold - + d2 = _mm_sub_epi16(_mm_avg_epu16(x3, x1), x2); d2 = _mm_add_epi16(d2, dl); d2 = _mm_srai_epi16(d2, 1); d2 = _mm_min_epi16(d2, tcx); d2 = _mm_max_epi16(d2, _mm_sub_epi16(_mm_setzero_si128(), tcx)); - + y2 = _mm_add_epi16(y2, d2); } - + // Store sample values z0 = _mm_packus_epi16(y0, y1); z1 = _mm_packus_epi16(y2, y3); @@ -240,12 +240,12 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( } EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( - EB_BYTE edgeStartSampleCb, - EB_BYTE edgeStartSampleCr, - EB_U32 reconChromaPicStride, - EB_BOOL isVerticalEdge, - EB_U8 cbTc, - EB_U8 crTc) + EB_BYTE edgeStartSampleCb, + EB_BYTE edgeStartSampleCr, + EB_U32 reconChromaPicStride, + EB_BOOL isVerticalEdge, + EB_U8 cbTc, + EB_U8 crTc) { __m128i x0, x1, x2, x3; __m128i a0, a1, a2, a3, a4, a5, a6, a7; @@ -263,12 +263,12 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( a0 = _mm_unpacklo_epi16(a0, a2); a1 = _mm_unpacklo_epi16(a1, a3); - + a0 = _mm_unpacklo_epi8(a0, a1); - + a0 = _mm_shufflelo_epi16(a0, 0xd8); // 11011000 a0 = _mm_shufflehi_epi16(a0, 0xd8); // 11011000 - + x0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); x1 = _mm_srli_si128(x0, 8); x2 = _mm_unpackhi_epi8(a0, _mm_setzero_si128()); @@ -282,13 +282,13 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( x0 = _mm_srai_epi16(x0, 1); x0 = _mm_min_epi16(x0, lim); x0 = _mm_max_epi16(x0, _mm_sub_epi16(_mm_setzero_si128(), lim)); - - + + x1 = _mm_add_epi16(x1, x0); x2 = _mm_sub_epi16(x2, x0); x1 = _mm_unpacklo_epi16(x1, x2); x1 = _mm_packus_epi16(x1, x1); - + *(EB_U16 *)(edgeStartSampleCb-1+0*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 0)); *(EB_U16 *)(edgeStartSampleCb-1+1*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 1)); *(EB_U16 *)(edgeStartSampleCr-1+0*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 2)); @@ -300,7 +300,7 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( a1 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCb-1*reconChromaPicStride)); a2 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCb+0*reconChromaPicStride)); a3 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCb+1*reconChromaPicStride)); - + a4 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCr-2*reconChromaPicStride)); a0 = _mm_unpacklo_epi16(a0, a4); a5 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCr-1*reconChromaPicStride)); @@ -309,12 +309,12 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( a2 = _mm_unpacklo_epi16(a2, a6); a7 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCr+1*reconChromaPicStride)); a3 = _mm_unpacklo_epi16(a3, a7); - + x0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); x1 = _mm_unpacklo_epi8(a1, _mm_setzero_si128()); x2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); x3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); - + x0 = _mm_sub_epi16(x0, x3); x3 = _mm_sub_epi16(x2, x1); x0 = _mm_srai_epi16(x0, 2); @@ -323,11 +323,11 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( x0 = _mm_srai_epi16(x0, 1); x0 = _mm_min_epi16(x0, lim); x0 = _mm_max_epi16(x0, _mm_sub_epi16(_mm_setzero_si128(), lim)); - - + + x1 = _mm_add_epi16(x1, x0); x2 = _mm_sub_epi16(x2, x0); - + x1 = _mm_packus_epi16(x1, x2); *(EB_U16 *)(edgeStartSampleCb-1*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 0)); *(EB_U16 *)(edgeStartSampleCb+0*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 4)); diff --git a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h index 313af2edb..c55ddeed7 100644 --- a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h @@ -12,26 +12,26 @@ extern "C" { #include "EbDefinitions.h" extern void Luma4SampleEdgeDLFCore_SSSE3( - EB_BYTE edgeStartSample, - EB_U32 reconLumaPicStride, - EB_BOOL isVerticalEdge, - EB_S32 tc, + EB_BYTE edgeStartSample, + EB_U32 reconLumaPicStride, + EB_BOOL isVerticalEdge, + EB_S32 tc, EB_S32 beta); void Chroma2SampleEdgeDLFCore_SSSE3( - EB_BYTE edgeStartSampleCb, - EB_BYTE edgeStartSampleCr, - EB_U32 reconChromaPicStride, - EB_BOOL isVerticalEdge, - EB_U8 cbTc, + EB_BYTE edgeStartSampleCb, + EB_BYTE edgeStartSampleCr, + EB_U32 reconChromaPicStride, + EB_BOOL isVerticalEdge, + EB_U8 cbTc, EB_U8 crTc); void Luma4SampleEdgeDLFCore16bit_SSSE3_INTRIN( - EB_U16 *edgeStartFilteredSamplePtr, - EB_U32 reconLumaPicStride, - EB_BOOL isVerticalEdge, - EB_S32 tc, - EB_S32 beta); + EB_U16 *edgeStartFilteredSamplePtr, + EB_U32 reconLumaPicStride, + EB_BOOL isVerticalEdge, + EB_S32 tc, + EB_S32 beta); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_SSSE3/EbIntraPrediction_SSSE3.h b/Source/Lib/ASM_SSSE3/EbIntraPrediction_SSSE3.h index 7bffed9cf..264c3ebea 100644 --- a/Source/Lib/ASM_SSSE3/EbIntraPrediction_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbIntraPrediction_SSSE3.h @@ -22,4 +22,4 @@ extern void IntraModeDCChroma16bit_SSSE3_INTRIN( #ifdef __cplusplus } #endif -#endif // EbIntraPrediction_SSSE3_h \ No newline at end of file +#endif // EbIntraPrediction_SSSE3_h diff --git a/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c index 40de28d2b..51c01324b 100644 --- a/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c @@ -19,7 +19,7 @@ #ifdef __linux__ -#ifndef __cplusplus +#ifndef __cplusplus __attribute__((visibility("hidden"))) #endif #endif @@ -32,7 +32,7 @@ const EB_S16 lumaFilterCoeff[4][8] = }; #ifdef __linux__ -#ifndef __cplusplus +#ifndef __cplusplus __attribute__((visibility("hidden"))) #endif #endif @@ -45,7 +45,7 @@ const EB_S16 lumaFilterCoeff7[4][8] = }; #ifdef __linux__ -#ifndef __cplusplus +#ifndef __cplusplus __attribute__((visibility("hidden"))) #endif #endif @@ -76,7 +76,7 @@ static void PrefetchBlock(EB_U8 *src, EB_U32 srcStride, EB_U32 blkWidth, EB_U32 EB_U8 *addr0 = src; EB_U8 *addr1 = addr0 + blkWidth - 1; src += srcStride; - + _mm_prefetch((char*)addr0, _MM_HINT_T0); _mm_prefetch((char*)addr1, _MM_HINT_T0); } @@ -90,23 +90,23 @@ static void PrefetchBlock(EB_U8 *src, EB_U32 srcStride, EB_U32 blkWidth, EB_U32 } void PictureCopyKernel_SSSE3( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight, - EB_U32 bytesPerSample) -{ - + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight, + EB_U32 bytesPerSample) +{ + EB_U32 rowCount, colCount; - (void)bytesPerSample; - - + (void)bytesPerSample; + + PrefetchBlock(src, srcStride, areaWidth, areaHeight); - - + + if (areaWidth & 2) { EB_BYTE ptr = src; @@ -129,7 +129,7 @@ void PictureCopyKernel_SSSE3( src += 2; dst += 2; } - + if (areaWidth & 4) { EB_BYTE ptr = src; @@ -153,7 +153,7 @@ void PictureCopyKernel_SSSE3( src += 4; dst += 4; } - + if (areaWidth & 8) { EB_BYTE ptr = src; @@ -177,7 +177,7 @@ void PictureCopyKernel_SSSE3( src += 8; dst += 8; } - + colCount = areaWidth; do { @@ -202,15 +202,15 @@ void PictureCopyKernel_SSSE3( } void ChromaInterpolationCopy_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { (void)firstPassIFDst; (void)fracPosx; @@ -219,13 +219,13 @@ void ChromaInterpolationCopy_SSSE3( } void LumaInterpolationCopy_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; PictureCopyKernel_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 1); @@ -245,14 +245,14 @@ void LumaInterpolationFilterTwoDInRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - - + + if (puWidth & 4) { rowCount = puHeight; - + qtr = dst; - + do { a0 = _mm_loadu_si128((__m128i *)(firstPassIFDst+0*4)); @@ -263,10 +263,10 @@ void LumaInterpolationFilterTwoDInRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst a5 = _mm_loadu_si128((__m128i *)(firstPassIFDst+5*4)); a6 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6*4)); a0 = _mm_sub_epi16(a0, a6); - + sum0 = _mm_set1_epi32(257<<11); sum1 = _mm_set1_epi32(257<<11); - + b0l = _mm_unpacklo_epi16(a0, a1); b0h = _mm_unpackhi_epi16(a0, a1); @@ -274,37 +274,37 @@ void LumaInterpolationFilterTwoDInRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst b1h = _mm_unpackhi_epi16(a2, a3); b2l = _mm_unpacklo_epi16(a4, a5); b2h = _mm_unpackhi_epi16(a4, a5); - + sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b0l, c0)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(b0h, c0)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b1l, c1)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(b1h, c1)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b2l, c2)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(b2h, c2)); - + sum0 = _mm_srai_epi32(sum0, 12); sum1 = _mm_srai_epi32(sum1, 12); sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum0, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum0, 1); qtr += dstStride; - + firstPassIFDst += 8; rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + firstPassIFDst += (fracPosy == 2) ? 32 : 24; dst += 4; } - + colCount = puWidth; do { @@ -321,7 +321,7 @@ void LumaInterpolationFilterTwoDInRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst a5 = _mm_loadu_si128((__m128i *)(firstPassIFDst+5*8)); a6 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6*8)); a0 = _mm_sub_epi16(a0, a6); - + sum0 = _mm_set1_epi32(257<<11); sum1 = _mm_set1_epi32(257<<11); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a0, a1), c0)); @@ -330,19 +330,19 @@ void LumaInterpolationFilterTwoDInRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a2, a3), c1)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a4, a5), c2)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a4, a5), c2)); - + sum0 = _mm_srai_epi32(sum0, 12); sum1 = _mm_srai_epi32(sum1, 12); sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); - + _mm_storel_epi64((__m128i *)qtr, sum0); qtr += dstStride; - + firstPassIFDst += 8; rowCount--; } while (rowCount > 0); - + firstPassIFDst += (fracPosy == 2) ? 56 : 48; dst += 8; colCount -= 8; @@ -353,18 +353,18 @@ void LumaInterpolationFilterTwoDInRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S16 *dst, EB_U32 puWidth, EB_U32 puHeight, EB_U32 fracPosy) { EB_S32 rowCount, colCount; - + __m128i a0, a1, a2, a3, a4, a5, a6; __m128i c0, c1, c2; c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff7[fracPosy]); c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { rowCount = puHeight; - + do { __m128i sum0, sum1; @@ -376,35 +376,35 @@ void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S1 a5 = _mm_loadu_si128((__m128i *)(firstPassIFDst+5*4)); a6 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6*4)); a0 = _mm_sub_epi16(a0, a6); - + sum0 = _mm_madd_epi16(_mm_unpacklo_epi16(a0, a1), c0); sum1 = _mm_madd_epi16(_mm_unpackhi_epi16(a0, a1), c0); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a2, a3), c1)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a2, a3), c1)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a4, a5), c2)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a4, a5), c2)); - + sum0 = _mm_srai_epi32(sum0, 6); sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); - + _mm_storeu_si128((__m128i *)dst, sum0); dst += 8; - + firstPassIFDst += 8; rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + firstPassIFDst += (fracPosy == 2) ? 32 : 24; } - + colCount = puWidth; do { @@ -413,7 +413,7 @@ void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S1 { __m128i b0l, b0h, b1l, b1h, b2l, b2h; __m128i sum0, sum1; - + a0 = _mm_loadu_si128((__m128i *)(firstPassIFDst+0*8)); a1 = _mm_loadu_si128((__m128i *)(firstPassIFDst+1*8)); a2 = _mm_loadu_si128((__m128i *)(firstPassIFDst+2*8)); @@ -422,7 +422,7 @@ void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S1 a5 = _mm_loadu_si128((__m128i *)(firstPassIFDst+5*8)); a6 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6*8)); a0 = _mm_sub_epi16(a0, a6); - + b0l = _mm_unpacklo_epi16(a0, a1); b0h = _mm_unpackhi_epi16(a0, a1); b1l = _mm_unpacklo_epi16(a2, a3); @@ -436,11 +436,11 @@ void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S1 sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(b1h, c1)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b2l, c2)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(b2h, c2)); - + sum0 = _mm_srai_epi32(sum0, 6); sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); - + _mm_storeu_si128((__m128i *)dst, sum0); dst += 8; @@ -448,7 +448,7 @@ void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S1 rowCount--; } while (rowCount > 0); - + firstPassIFDst += (fracPosy == 2) ? 56 : 48; colCount -= 8; } @@ -458,7 +458,7 @@ void LumaInterpolationFilterTwoDInRawOutRaw7_SSSE3(EB_S16 *firstPassIFDst, EB_S1 void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight) { EB_S32 rowCount, colCount; - + __m128i c0, c1; __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i sum0, sum1; @@ -468,14 +468,14 @@ void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff7[2]); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - - - + + + if (puWidth & 4) { rowCount = puHeight; qtr = dst; - + do { a0 = _mm_loadu_si128((__m128i *)(firstPassIFDst+0*4)); @@ -486,10 +486,10 @@ void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst a5 = _mm_loadu_si128((__m128i *)(firstPassIFDst+5*4)); a6 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6*4)); a7 = _mm_loadu_si128((__m128i *)(firstPassIFDst+7*4)); - + sum0 = _mm_set1_epi32(257<<11); sum1 = _mm_set1_epi32(257<<11); - + a0 = _mm_add_epi16(a0, a7); a1 = _mm_add_epi16(a1, a6); a2 = _mm_add_epi16(a2, a5); @@ -498,34 +498,34 @@ void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a0, a1), c0)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a2, a3), c1)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a2, a3), c1)); - + sum0 = _mm_srai_epi32(sum0, 12); sum1 = _mm_srai_epi32(sum1, 12); sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum0, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum0, 1); qtr += dstStride; firstPassIFDst += 8; rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + firstPassIFDst += 32; dst += 4; } - + colCount = puWidth; do { qtr = dst; - + rowCount = puHeight; do { @@ -537,7 +537,7 @@ void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst a5 = _mm_loadu_si128((__m128i *)(firstPassIFDst+5*8)); a6 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6*8)); a7 = _mm_loadu_si128((__m128i *)(firstPassIFDst+7*8)); - + sum0 = _mm_set1_epi32(257<<11); sum1 = _mm_set1_epi32(257<<11); a0 = _mm_add_epi16(a0, a7); @@ -548,17 +548,17 @@ void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a0, a1), c0)); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a2, a3), c1)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a2, a3), c1)); - + sum0 = _mm_srai_epi32(sum0, 12); sum1 = _mm_srai_epi32(sum1, 12); sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); - + _mm_storel_epi64((__m128i *)qtr, sum0); qtr += dstStride; firstPassIFDst += 8; } while (--rowCount > 0); - + firstPassIFDst += 56; dst += 8; colCount -= 8; @@ -569,17 +569,17 @@ void LumaInterpolationFilterTwoDInRawM_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE dst void LumaInterpolationFilterTwoDInRawOutRawM_SSSE3(EB_S16 *firstPassIFDst, EB_S16 *dst, EB_U32 puWidth, EB_U32 puHeight) { EB_S32 rowCount, colCount; - + __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i c0, c1; c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff7[2]); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { rowCount = puHeight; - + do { __m128i sum0, sum1; @@ -600,27 +600,27 @@ void LumaInterpolationFilterTwoDInRawOutRawM_SSSE3(EB_S16 *firstPassIFDst, EB_S1 sum1 = _mm_madd_epi16(_mm_unpackhi_epi16(a0, a1), c0); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a2, a3), c1)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a2, a3), c1)); - + sum0 = _mm_srai_epi32(sum0, 6); sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); - + _mm_storeu_si128((__m128i *)dst, sum0); dst += 8; firstPassIFDst += 8; rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + firstPassIFDst += 32; } - + colCount = puWidth; do { @@ -645,17 +645,17 @@ void LumaInterpolationFilterTwoDInRawOutRawM_SSSE3(EB_S16 *firstPassIFDst, EB_S1 sum1 = _mm_madd_epi16(_mm_unpackhi_epi16(a0, a1), c0); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(_mm_unpacklo_epi16(a2, a3), c1)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(_mm_unpackhi_epi16(a2, a3), c1)); - + sum0 = _mm_srai_epi32(sum0, 6); sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); - + _mm_storeu_si128((__m128i *)dst, sum0); dst += 8; firstPassIFDst += 8; } while (--rowCount > 0); - + firstPassIFDst += 56; colCount -= 8; } @@ -663,23 +663,23 @@ void LumaInterpolationFilterTwoDInRawOutRawM_SSSE3(EB_S16 *firstPassIFDst, EB_S1 } void PictureCopyKernelOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 offset) -{ - + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 offset) +{ + EB_U32 rowCount, colCount; __m128i o; PrefetchBlock(refPic, srcStride, puWidth, puHeight); - - - + + + /*__m128i*/ o = _mm_set1_epi16(offset); - + if (puWidth & 2) { __m128i a0; @@ -696,21 +696,21 @@ void PictureCopyKernelOutRaw_SSSE3( a0 = _mm_slli_epi16(a0, 6); a0 = _mm_sub_epi16(a0, o); _mm_storeu_si128((__m128i *)dst, a0); - + dst += 8; rowCount -= 4; } while (rowCount != 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + refPic += 2; } - + if (puWidth & 4) { EB_BYTE ptr = refPic; @@ -725,21 +725,21 @@ void PictureCopyKernelOutRaw_SSSE3( a0 = _mm_slli_epi16(a0, 6); a0 = _mm_sub_epi16(a0, o); _mm_storeu_si128((__m128i *)dst, a0); - + dst += 8; rowCount -= 2; } while (rowCount != 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - + colCount = puWidth; do { @@ -756,7 +756,7 @@ void PictureCopyKernelOutRaw_SSSE3( dst += 8; } while (--rowCount != 0); - + colCount -= 8; refPic += 8; } @@ -764,14 +764,14 @@ void PictureCopyKernelOutRaw_SSSE3( } void ChromaInterpolationCopyOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { (void)firstPassIFDst; (void)fracPosx; @@ -791,10 +791,10 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0); offset = _mm_set1_epi32(1 << 11); - + if (puWidth & 2) { - + rowCount = puHeight; qtr = dst; do @@ -803,12 +803,12 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds a1 = _mm_loadu_si128((__m128i *)(firstPassIFDst+2)); a2 = _mm_loadu_si128((__m128i *)(firstPassIFDst+4)); a3 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6)); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpacklo_epi16(a2, a3); b2 = _mm_unpackhi_epi16(a0, a1); b3 = _mm_unpackhi_epi16(a2, a3); - + sum0 = _mm_madd_epi16(b0, c0); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b1, c1)); sum1 = _mm_madd_epi16(b2, c0); @@ -819,17 +819,17 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds sum1 = _mm_srai_epi32(sum1, 12); sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); - + *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum0, 0)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum0, 1)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum0, 2)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum0, 3)); qtr += dstStride; - + firstPassIFDst += 8; rowCount -= 4; } while (rowCount != 0); - + puWidth -= 2; if (puWidth == 0) { @@ -838,7 +838,7 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds firstPassIFDst += 8; dst += 2; } - + if (puWidth & 4) { rowCount = puHeight; @@ -853,7 +853,7 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds b1 = _mm_unpacklo_epi16(a2, a3); b2 = _mm_unpackhi_epi16(a0, a1); b3 = _mm_unpackhi_epi16(a2, a3); - + sum0 = _mm_madd_epi16(b0, c0); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b1, c1)); sum1 = _mm_madd_epi16(b2, c0); @@ -864,25 +864,25 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds sum1 = _mm_srai_epi32(sum1, 12); sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum0, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum0, 1); qtr += dstStride; - + firstPassIFDst += 8; rowCount -= 2; } while (rowCount != 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + firstPassIFDst += 16; dst += 4; } - + colCount = puWidth; do { @@ -891,7 +891,7 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds a0 = _mm_loadu_si128((__m128i *)(firstPassIFDst+0*8)); a1 = _mm_loadu_si128((__m128i *)(firstPassIFDst+1*8)); a2 = _mm_loadu_si128((__m128i *)(firstPassIFDst+2*8)); - + do { a3 = _mm_loadu_si128((__m128i *)(firstPassIFDst+3*8)); @@ -900,7 +900,7 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds b1 = _mm_unpacklo_epi16(a2, a3); b2 = _mm_unpackhi_epi16(a0, a1); b3 = _mm_unpackhi_epi16(a2, a3); - + sum0 = _mm_madd_epi16(b0, c0); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(b1, c1)); sum1 = _mm_madd_epi16(b2, c0); @@ -912,14 +912,14 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds sum0 = _mm_packs_epi32(sum0, sum1); sum0 = _mm_packus_epi16(sum0, sum0); _mm_storel_epi64((__m128i *)qtr, sum0); qtr += dstStride; - + a0 = a1; a1 = a2; a2 = a3; firstPassIFDst += 8; } while (--rowCount != 0); - + firstPassIFDst += 24; colCount -= 8; dst += 8; @@ -929,44 +929,44 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds void ChromaInterpolationFilterOneDHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_S32 rowCount, colCount; - __m128i c0, c2; // coeffs - __m128i a0, a1, a2, a3; - __m128i b0, b1; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c2; // coeffs + __m128i a0, a1, a2, a3; + __m128i b0, b1; + __m128i sum; - EB_BYTE ptr,qtr; + EB_BYTE ptr,qtr; (void)firstPassIFDst; (void)fracPosy; - - + + refPic--; - + PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); - + c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); c0 = _mm_unpacklo_epi16(c0, c0); c2 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 2) { rowCount = puHeight; ptr = refPic; qtr = dst; - + do { // Need 5 samples, load 8 @@ -974,39 +974,39 @@ void ChromaInterpolationFilterOneDHorizontal_SSSE3( a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a2 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; - + a0 = _mm_unpacklo_epi8(a0, a1); // 10 samples a2 = _mm_unpacklo_epi8(a2, a3); // 10 samples - + b0 = _mm_unpacklo_epi16(a0, a2); - + sum = _mm_set1_epi16(32); sum = _mm_add_epi16(sum ,_mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 4, 4, 8, 1, 5, 5, 9, 2, 6, 6, 10, 3, 7, 7, 11)), c0)); b0 = _mm_unpacklo_epi16(_mm_srli_si128(a0, 4), _mm_srli_si128(a2, 4)); sum = _mm_add_epi16(sum ,_mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 4, 4, 8, 1, 5, 5, 9, 2, 6, 6, 10, 3, 7, 7, 11)), c2)); sum = _mm_srai_epi16(sum , 6); sum = _mm_packus_epi16(sum, sum); - + *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 0)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 1)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 2)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 3)); qtr += dstStride; - + rowCount -= 4; } while (rowCount > 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + refPic += 2; dst += 2; } - - + + if (puWidth & 4) { rowCount = puHeight; @@ -1017,34 +1017,34 @@ void ChromaInterpolationFilterOneDHorizontal_SSSE3( // Need 7 samples, load 8 a0 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; - + sum = _mm_set1_epi16(32); a0 = _mm_unpacklo_epi64(a0, a1); b0 = _mm_shuffle_epi8(a0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)); b1 = _mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(b0, c0)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(b1, c2)); - + sum = _mm_srai_epi16(sum , 6); sum = _mm_packus_epi16(sum, sum); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum, 1); qtr += dstStride; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; dst += 4; } - + colCount = puWidth; do { @@ -1055,7 +1055,7 @@ void ChromaInterpolationFilterOneDHorizontal_SSSE3( { // Need 11 samples, load 16 a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - + sum = _mm_set1_epi16(32); a2 = _mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10)); a0 = _mm_shuffle_epi8(a0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8)); @@ -1063,11 +1063,11 @@ void ChromaInterpolationFilterOneDHorizontal_SSSE3( sum = _mm_add_epi16(sum, _mm_maddubs_epi16(a2, c2)); sum = _mm_srai_epi16(sum , 6); sum = _mm_packus_epi16(sum, sum); - + _mm_storel_epi64((__m128i *)qtr, sum); qtr += dstStride; } while (--rowCount > 0); - + refPic += 8; dst += 8; colCount -= 8; @@ -1077,34 +1077,34 @@ void ChromaInterpolationFilterOneDHorizontal_SSSE3( void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { EB_S32 rowCount, colCount; __m128i c0, c2; // coeffs __m128i a0, a1, a2, a3; __m128i b0, b1; __m128i sum; - + EB_BYTE ptr; (void)firstPassIFDst; (void)fracPosy; - + refPic--; PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); - + c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); c0 = _mm_unpacklo_epi16(c0, c0); c2 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 2) { rowCount = puHeight; @@ -1116,65 +1116,65 @@ void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a2 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; - + a0 = _mm_unpacklo_epi8(a0, a1); // 10 samples a2 = _mm_unpacklo_epi8(a2, a3); // 10 samples b0 = _mm_unpacklo_epi16(a0, a2); - + sum = _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 4, 4, 8, 1, 5, 5, 9, 2, 6, 6, 10, 3, 7, 7, 11)), c0); b0 = _mm_unpacklo_epi16(_mm_srli_si128(a0, 4), _mm_srli_si128(a2, 4)); sum = _mm_add_epi16(sum ,_mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 4, 4, 8, 1, 5, 5, 9, 2, 6, 6, 10, 3, 7, 7, 11)), c2)); - + _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 4; } while (rowCount > 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + refPic += 2; } - + if (puWidth & 4) { rowCount = puHeight; ptr = refPic; do { - + // Need 7 samples, load 8 a0 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; - + a0 = _mm_unpacklo_epi64(a0, a1); b0 = _mm_shuffle_epi8(a0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)); b1 = _mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)); sum = _mm_maddubs_epi16(b0, c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(b1, c2)); - + _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - - + + colCount = puWidth; do { @@ -1182,7 +1182,7 @@ void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( rowCount = puHeight; do { - + // Need 11 samples, load 16 a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; a2 = _mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10)); @@ -1193,7 +1193,7 @@ void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( dst += 8; } while (--rowCount > 0); - + colCount -= 8; refPic += 8; } @@ -1203,55 +1203,55 @@ void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( void ChromaInterpolationFilterOneDVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_S32 rowCount, colCount; - __m128i c0, c2; // coeffs - __m128i a0, a1, a2, a3; - __m128i b0, b1, b2, b3; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c2; // coeffs + __m128i a0, a1, a2, a3; + __m128i b0, b1, b2, b3; + __m128i sum; - EB_BYTE ptr,qtr; + EB_BYTE ptr,qtr; (void)firstPassIFDst; (void)fracPosx; - + refPic -= srcStride; PrefetchBlock(refPic, srcStride, puWidth, puHeight+3); - - + + c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeff[fracPosy]); c0 = _mm_packs_epi16(c0, c0); c0 = _mm_unpacklo_epi16(c0, c0); c2 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 2) { rowCount = puHeight; ptr = refPic; qtr = dst; - + a0 = _mm_setzero_si128(); a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 0); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 1); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 2); ptr += srcStride; - + do { a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 3); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 4); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 5); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 6); ptr += srcStride; - + sum = _mm_set1_epi16(32); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9)), c0)); a0 = _mm_srli_si128(a0, 4); @@ -1259,26 +1259,26 @@ void ChromaInterpolationFilterOneDVertical_SSSE3( a0 = _mm_srli_si128(a0, 4); sum = _mm_srai_epi16(sum , 6); sum = _mm_packus_epi16(sum, sum); - + *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 0)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 1)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 2)); qtr += dstStride; *(EB_U16 *)qtr = (EB_U16)(_mm_extract_epi16(sum, 3)); qtr += dstStride; - + rowCount -= 4; } while (rowCount > 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + refPic += 2; dst += 2; } - + if (puWidth & 4) { rowCount = puHeight; @@ -1289,7 +1289,7 @@ void ChromaInterpolationFilterOneDVertical_SSSE3( b2 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a0 = _mm_unpacklo_epi32(b2, b1); a0 = _mm_unpacklo_epi64(a0, b0); - + do { sum = _mm_set1_epi16(32); @@ -1301,24 +1301,24 @@ void ChromaInterpolationFilterOneDVertical_SSSE3( sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(8, 4, 9, 5, 10, 6, 11, 7, 4, 0, 5, 1, 6, 2, 7, 3)), c2)); sum = _mm_srai_epi16(sum , 6); sum = _mm_packus_epi16(sum, sum); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum, 1); qtr += dstStride; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; dst += 4; } - + colCount = puWidth; do { @@ -1328,27 +1328,27 @@ void ChromaInterpolationFilterOneDVertical_SSSE3( a0 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a2 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; - + do { - + sum = _mm_set1_epi16(32); a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_unpacklo_epi8(a0, a1), c0)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_unpacklo_epi8(a2, a3), c2)); - + a0 = a1; a1 = a2; a2 = a3; - + sum = _mm_srai_epi16(sum , 6); sum = _mm_packus_epi16(sum, sum); - + _mm_storel_epi64((__m128i *)qtr, sum); qtr += dstStride; - + } while (--rowCount > 0); - + refPic += 8; dst += 8; colCount -= 8; @@ -1358,26 +1358,26 @@ void ChromaInterpolationFilterOneDVertical_SSSE3( void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_S32 rowCount, colCount; - __m128i c0, c2; // coeffs - __m128i a0, a1, a2, a3; - __m128i b0, b1, b2, b3; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c2; // coeffs + __m128i a0, a1, a2, a3; + __m128i b0, b1, b2, b3; + __m128i sum; - EB_BYTE ptr; + EB_BYTE ptr; (void)firstPassIFDst; (void)fracPosx; - + refPic -= srcStride; PrefetchBlock(refPic, srcStride, puWidth, puHeight+3); @@ -1386,7 +1386,7 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( c0 = _mm_unpacklo_epi16(c0, c0); c2 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 2) { rowCount = puHeight; @@ -1395,35 +1395,35 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 0); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 1); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 2); ptr += srcStride; - + do { a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 3); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 4); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 5); ptr += srcStride; a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptr, 6); ptr += srcStride; - + sum = _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9)), c0); a0 = _mm_srli_si128(a0, 4); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9)), c2)); a0 = _mm_srli_si128(a0, 4); - + _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 4; } while (rowCount > 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + refPic += 2; } - + if (puWidth & 4) { rowCount = puHeight; @@ -1433,7 +1433,7 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( b2 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a0 = _mm_unpacklo_epi32(b2, b1); a0 = _mm_unpacklo_epi64(a0, b0); - + do { sum = _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(8, 4, 9, 5, 10, 6, 11, 7, 4, 0, 5, 1, 6, 2, 7, 3)), c0); @@ -1442,23 +1442,23 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( b3 = _mm_unpacklo_epi32(b0, b3); a0 = _mm_unpacklo_epi64(b3, a0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(8, 4, 9, 5, 10, 6, 11, 7, 4, 0, 5, 1, 6, 2, 7, 3)), c2)); - + _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - + colCount = puWidth; do { @@ -1467,22 +1467,22 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( a0 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a2 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; - + do { - - a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; + + a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; sum = _mm_maddubs_epi16(_mm_unpacklo_epi8(a0, a1), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_unpacklo_epi8(a2, a3), c2)); a0 = a1; a1 = a2; a2 = a3; - + _mm_storeu_si128((__m128i *)dst, sum); dst += 8; } while (--rowCount > 0); - + refPic += 8; colCount -= 8; } @@ -1492,15 +1492,15 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( void ChromaInterpolationFilterTwoD_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-srcStride, srcStride, firstPassIFDst, puWidth, puHeight+3, NULL, fracPosx, 0); ChromaInterpolationFilterTwoDInRaw_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight, fracPosy); @@ -1510,11 +1510,11 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S { EB_S32 rowCount, colCount; __m128i c0, c1; // coeffs - + c0 = _mm_loadl_epi64((__m128i *)chromaFilterCoeff[fracPosy]); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0); - + if (puWidth & 2) { rowCount = puHeight; @@ -1526,7 +1526,7 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S __m128i a3 = _mm_loadu_si128((__m128i *)(firstPassIFDst+6)); __m128i b0, b1, b2, b3; __m128i sum0, sum1; - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpacklo_epi16(a2, a3); b2 = _mm_unpackhi_epi16(a0, a1); @@ -1539,13 +1539,13 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); _mm_storeu_si128((__m128i *)dst, sum0); - + firstPassIFDst += 8; dst += 8; rowCount -= 4; } while (rowCount > 0); - + puWidth -= 2; if (puWidth == 0) { @@ -1553,7 +1553,7 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S } firstPassIFDst += 8; } - + if (puWidth & 4) { rowCount = puHeight; @@ -1565,7 +1565,7 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S __m128i a3 = _mm_loadu_si128((__m128i *)(firstPassIFDst+12)); __m128i b0, b1, b2, b3; __m128i sum0, sum1; - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpacklo_epi16(a2, a3); b2 = _mm_unpackhi_epi16(a0, a1); @@ -1578,22 +1578,22 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); _mm_storeu_si128((__m128i *)dst, sum0); - + firstPassIFDst += 8; dst += 8; rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + firstPassIFDst += 16; } - + colCount = puWidth; do { @@ -1601,7 +1601,7 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S __m128i a1 = _mm_loadu_si128((__m128i *)(firstPassIFDst+1*8)); __m128i a2 = _mm_loadu_si128((__m128i *)(firstPassIFDst+2*8)); rowCount = puHeight; - + do { __m128i a3 = _mm_loadu_si128((__m128i *)(firstPassIFDst+3*8)); @@ -1619,7 +1619,7 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S sum1 = _mm_srai_epi32(sum1, 6); sum0 = _mm_packs_epi32(sum0, sum1); _mm_storeu_si128((__m128i *)dst, sum0); - + a0 = a1; a1 = a2; a2 = a3; @@ -1627,7 +1627,7 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S dst += 8; } while (--rowCount > 0); - + firstPassIFDst += 24; colCount -= 8; } @@ -1636,14 +1636,14 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S void ChromaInterpolationFilterTwoDOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-srcStride, srcStride, firstPassIFDst, puWidth, puHeight+3, NULL, fracPosx, 0); ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(firstPassIFDst, dst, puWidth, puHeight, fracPosy); @@ -1652,25 +1652,25 @@ void ChromaInterpolationFilterTwoDOutRaw_SSSE3( void LumaInterpolationFilterOneDHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1; - __m128i b0; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1; + __m128i b0; + __m128i sum; refPic -= 3; - + PrefetchBlock(refPic, srcStride, (puWidth == 4) ? 16 : puWidth+8, (puWidth == 4) ? ((puHeight+1)&~1) : puHeight); - + c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); c0 = _mm_unpacklo_epi16(c0, c0); @@ -1678,7 +1678,7 @@ void LumaInterpolationFilterOneDHorizontal_SSSE3( c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { EB_BYTE ptr = refPic; @@ -1688,10 +1688,10 @@ void LumaInterpolationFilterOneDHorizontal_SSSE3( { a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - - + + sum = _mm_set1_epi16(32); - + b0 = _mm_unpacklo_epi64(a0, a1); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)), c0)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)), c1)); @@ -1700,35 +1700,35 @@ void LumaInterpolationFilterOneDHorizontal_SSSE3( sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)), c3)); sum = _mm_srai_epi16(sum, 6); sum = _mm_packus_epi16(sum, sum); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum, 1); qtr += dstStride; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; dst += 4; } - + colCount = puWidth; do { EB_BYTE ptr = refPic; EB_BYTE qtr = dst; - + rowCount = puHeight; do { a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - + sum = _mm_set1_epi16(32); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8)), c0)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10)), c1)); @@ -1736,38 +1736,38 @@ void LumaInterpolationFilterOneDHorizontal_SSSE3( sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14)), c3)); sum = _mm_srai_epi16(sum, 6); sum = _mm_packus_epi16(sum, sum); - + _mm_storel_epi64((__m128i *)qtr, sum); qtr += dstStride; } while (--rowCount > 0); - + refPic += 8; dst += 8; - + colCount -= 8; } while (colCount > 0); } void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1; - __m128i b0; - __m128i sum; - EB_BYTE ptr; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1; + __m128i b0; + __m128i sum; + EB_BYTE ptr; refPic -= 3; - + PrefetchBlock(refPic, srcStride, (puWidth == 4) ? 16 : puWidth+8, (puWidth == 4) ? ((puHeight+1)&~1) : puHeight); - + c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); @@ -1776,7 +1776,7 @@ void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { ptr = refPic; @@ -1786,32 +1786,32 @@ void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - + b0 = _mm_unpacklo_epi64(a0, a1); sum = _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)), c1)); b0 = _mm_unpacklo_epi64(_mm_srli_si128(a0, 4), _mm_srli_si128(a1, 4)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)), c2)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)), c3)); - + sum = _mm_sub_epi16(sum, _mm_set1_epi16(128*64)); _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - + colCount = puWidth; do { @@ -1820,19 +1820,19 @@ void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( do { a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - + sum = _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8)), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10)), c1)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12)), c2)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14)), c3)); - + sum = _mm_sub_epi16(sum, _mm_set1_epi16(128*64)); - + _mm_storeu_si128((__m128i *)dst, sum); dst += 8; } while (--rowCount > 0); - + refPic += 8; colCount -= 8; } @@ -1840,24 +1840,24 @@ void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( } void LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1; - __m128i b0; - __m128i sum; - EB_BYTE ptr; - EB_S16 *qtr; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1; + __m128i b0; + __m128i sum; + EB_BYTE ptr; + EB_S16 *qtr; refPic -= 3; - + PrefetchBlock(refPic, srcStride, (puWidth == 4) ? 16 : puWidth+8, (puWidth == 4) ? ((puHeight+1)&~1) : puHeight); - + c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); @@ -1866,7 +1866,7 @@ void LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3( c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { ptr = refPic; @@ -1876,80 +1876,80 @@ void LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3( a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - + b0 = _mm_unpacklo_epi64(a0, a1); sum = _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)), c1)); b0 = _mm_unpacklo_epi64(_mm_srli_si128(a0, 4), _mm_srli_si128(a1, 4)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12)), c2)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14)), c3)); - + sum = _mm_sub_epi16(sum, _mm_set1_epi16(128*64)); _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - + colCount = puWidth; do { ptr = refPic; - qtr = dst; + qtr = dst; rowCount = puHeight; do { a0 = _mm_loadu_si128((__m128i *)ptr); ptr += srcStride; - + sum = _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8)), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10)), c1)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12)), c2)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(a0, _mm_setr_epi8(6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14)), c3)); - + sum = _mm_sub_epi16(sum, _mm_set1_epi16(128*64)); - + _mm_storeu_si128((__m128i *)qtr, sum);qtr += puWidth; } while (--rowCount > 0); - + refPic += 8; dst += 8; - + colCount -= 8; } while (colCount > 0); } void LumaInterpolationFilterOneDVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + __m128i sum; refPic -= 3*srcStride; - + PrefetchBlock(refPic, srcStride, puWidth, puHeight+7); - + c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); // Convert 16-bit coefficients to 8 bits c0 = _mm_unpacklo_epi16(c0, c0); @@ -1957,12 +1957,12 @@ void LumaInterpolationFilterOneDVertical_SSSE3( c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { EB_BYTE ptr = refPic; EB_BYTE qtr = dst; - + rowCount = puHeight; a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; @@ -1971,21 +1971,21 @@ void LumaInterpolationFilterOneDVertical_SSSE3( a4 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a5 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a6 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; - + b0 = _mm_unpacklo_epi32(_mm_setzero_si128(), a0); b1 = _mm_unpacklo_epi32(a1, a2); b2 = _mm_unpacklo_epi32(a3, a4); b3 = _mm_unpacklo_epi32(a5, a6); b0 = _mm_unpacklo_epi64(b0, b1); b1 = _mm_unpacklo_epi64(b2, b3); - + do { sum = _mm_set1_epi16(32); - + sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(4, 8, 5, 9, 6, 10, 7, 11, 8, 12, 9, 13, 10, 14, 11, 15)), c0)); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b1, _mm_setr_epi8(4, 8, 5, 9, 6, 10, 7, 11, 8, 12, 9, 13, 10, 14, 11, 15)), c2)); - + a7 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a8 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; b2 = _mm_unpacklo_epi32(a7, a8); @@ -1995,30 +1995,30 @@ void LumaInterpolationFilterOneDVertical_SSSE3( sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b1, _mm_setr_epi8(4, 8, 5, 9, 6, 10, 7, 11, 8, 12, 9, 13, 10, 14, 11, 15)), c3)); sum = _mm_srai_epi16(sum, 6); sum = _mm_packus_epi16(sum, sum); - + *(EB_U32 *)qtr = _mm_extract_epi32(sum, 0); qtr += dstStride; *(EB_U32 *)qtr = _mm_extract_epi32(sum, 1); qtr += dstStride; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; dst += 4; } - + colCount = puWidth; do { EB_BYTE ptr = refPic; EB_BYTE qtr = dst; - + rowCount = puHeight; a0 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; a1 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; @@ -2040,17 +2040,17 @@ void LumaInterpolationFilterOneDVertical_SSSE3( a8 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; b6 = _mm_unpacklo_epi8(a6, a7); b7 = _mm_unpacklo_epi8(a7, a8); - + sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b0, c0)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b2, c1)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b4, c2)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b6, c3)); - + sum = _mm_srai_epi16(sum, 6); sum = _mm_packus_epi16(sum, sum); - + _mm_storel_epi64((__m128i *)qtr, sum); qtr += dstStride; - + sum = _mm_set1_epi16(32); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b1, c0)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b3, c1)); @@ -2058,9 +2058,9 @@ void LumaInterpolationFilterOneDVertical_SSSE3( sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b7, c3)); sum = _mm_srai_epi16(sum, 6); sum = _mm_packus_epi16(sum, sum); - + _mm_storel_epi64((__m128i *)qtr, sum); qtr += dstStride; - + b0 = b2; b1 = b3; b2 = b4; @@ -2071,34 +2071,34 @@ void LumaInterpolationFilterOneDVertical_SSSE3( rowCount -= 2; } while (rowCount > 0); - + refPic += 8; dst += 8; - + colCount -= 8; } while (colCount > 0); } void LumaInterpolationFilterOneDOutRawVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - __m128i sum; - EB_BYTE ptr; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + __m128i sum; + EB_BYTE ptr; refPic -= 3*srcStride; - + PrefetchBlock(refPic, srcStride, puWidth, puHeight+7); - + c0 = _mm_loadu_si128((__m128i *)lumaFilterCoeff[fracPosx]); c0 = _mm_packs_epi16(c0, c0); // Convert 16-bit coefficients to 8 bits c0 = _mm_unpacklo_epi16(c0, c0); @@ -2106,7 +2106,7 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( c2 = _mm_shuffle_epi32(c0, 0xaa); c1 = _mm_shuffle_epi32(c0, 0x55); c0 = _mm_shuffle_epi32(c0, 0x00); - + if (puWidth & 4) { rowCount = puHeight; @@ -2118,20 +2118,20 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( a4 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a5 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a6 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; - + b0 = _mm_unpacklo_epi32(_mm_setzero_si128(), a0); b1 = _mm_unpacklo_epi32(a1, a2); b2 = _mm_unpacklo_epi32(a3, a4); b3 = _mm_unpacklo_epi32(a5, a6); b0 = _mm_unpacklo_epi64(b0, b1); b1 = _mm_unpacklo_epi64(b2, b3); - + do { - + sum = _mm_maddubs_epi16(_mm_shuffle_epi8(b0, _mm_setr_epi8(4, 8, 5, 9, 6, 10, 7, 11, 8, 12, 9, 13, 10, 14, 11, 15)), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_shuffle_epi8(b1, _mm_setr_epi8(4, 8, 5, 9, 6, 10, 7, 11, 8, 12, 9, 13, 10, 14, 11, 15)), c2)); - + a7 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; a8 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; b2 = _mm_unpacklo_epi32(a7, a8); @@ -2144,20 +2144,20 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + rowCount -= 2; } while (rowCount > 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + refPic += 4; } - + colCount = puWidth; do { @@ -2182,26 +2182,26 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( a8 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; b6 = _mm_unpacklo_epi8(a6, a7); b7 = _mm_unpacklo_epi8(a7, a8); - + sum = _mm_maddubs_epi16(b0, c0); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b2, c1)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b4, c2)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b6, c3)); - + sum = _mm_sub_epi16(sum, _mm_set1_epi16(128*64)); _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + sum = _mm_maddubs_epi16(b1, c0); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b3, c1)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b5, c2)); sum = _mm_add_epi16(sum,_mm_maddubs_epi16(b7, c3)); - + sum = _mm_sub_epi16(sum, _mm_set1_epi16(128*64)); _mm_storeu_si128((__m128i *)dst, sum); dst += 8; - + b0 = b2; b1 = b3; b2 = b4; @@ -2212,7 +2212,7 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( rowCount -= 2; } while (rowCount > 0); - + refPic += 8; colCount -= 8; } @@ -2221,86 +2221,86 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( void LumaInterpolationFilterPosa_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDHorizontal_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 1); } void LumaInterpolationFilterPosb_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDHorizontal_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 2); } void LumaInterpolationFilterPosc_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDHorizontal_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 3); } void LumaInterpolationFilterPosd_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDVertical_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 1); } void LumaInterpolationFilterPosh_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDVertical_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 2); } void LumaInterpolationFilterPosn_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDVertical_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 3); } @@ -2319,13 +2319,13 @@ void LumaInterpolationFilterPose_SSSE3( void LumaInterpolationFilterPosf_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { EB_U32 puHeight1 = puHeight + 6; EB_BYTE refPic1 = refPic - 3 * srcStride; @@ -2362,52 +2362,52 @@ void LumaInterpolationFilterPosi_SSSE3( void LumaInterpolationFilterPosj_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-3*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+7, 2); LumaInterpolationFilterTwoDInRawM_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight); } void LumaInterpolationFilterPosk_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-3*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+7, 3); LumaInterpolationFilterTwoDInRawM_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight); } void LumaInterpolationFilterPosp_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-2*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+6, 1); LumaInterpolationFilterTwoDInRaw7_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight, 3); } void LumaInterpolationFilterPosq_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { EB_U32 puHeight1 = puHeight + 6; EB_BYTE refPic1 = refPic - 2 * srcStride; @@ -2416,13 +2416,13 @@ void LumaInterpolationFilterPosq_SSSE3( } void LumaInterpolationFilterPosr_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-2*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+6, 3); LumaInterpolationFilterTwoDInRaw7_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight, 3); @@ -2430,12 +2430,12 @@ void LumaInterpolationFilterPosr_SSSE3( void LumaInterpolationCopyOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; PictureCopyKernelOutRaw_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 128*64); @@ -2444,24 +2444,24 @@ void LumaInterpolationCopyOutRaw_SSSE3( void LumaInterpolationFilterPosaOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 1); } void LumaInterpolationFilterPosbOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; //LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 2); @@ -2469,12 +2469,12 @@ void LumaInterpolationFilterPosbOutRaw_SSSE3( } void LumaInterpolationFilterPoscOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; //LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 3); @@ -2482,28 +2482,28 @@ void LumaInterpolationFilterPoscOutRaw_SSSE3( } void LumaInterpolationFilterPosdOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDOutRawVertical_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 1); } void LumaInterpolationFilterPoshOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDOutRawVertical_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 2); } @@ -2517,7 +2517,7 @@ void BiPredClipping_SSSE3( EB_S32 offset) { EB_U32 rowCount, colCount; - + if (puWidth & 2) { EB_BYTE q = dst; @@ -2529,12 +2529,12 @@ void BiPredClipping_SSSE3( a2 = _mm_loadu_si128((__m128i *)list1Src); list0Src += 8; list1Src += 8; - + a0 = _mm_adds_epi16(a0, a2); a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); a0 = _mm_srai_epi16(a0, 7); a0 = _mm_packus_epi16(a0, a0); - + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 0)); q += dstStride; *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 1)); q += dstStride; *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 2)); q += dstStride; @@ -2542,16 +2542,16 @@ void BiPredClipping_SSSE3( rowCount -= 4; } while (rowCount != 0); - + puWidth -= 2; if (puWidth == 0) { return; } - + dst += 2; } - + if (puWidth & 4) { EB_BYTE q = dst; @@ -2563,7 +2563,7 @@ void BiPredClipping_SSSE3( a2 = _mm_loadu_si128((__m128i *)list1Src); list0Src += 8; list1Src += 8; - + a0 = _mm_adds_epi16(a0, a2); a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); a0 = _mm_srai_epi16(a0, 7); @@ -2573,16 +2573,16 @@ void BiPredClipping_SSSE3( rowCount -= 2; } while (rowCount != 0); - + puWidth -= 4; if (puWidth == 0) { return; } - + dst += 4; } - + colCount = puWidth; do { @@ -2612,11 +2612,11 @@ void BiPredClipping_SSSE3( q += dstStride; _mm_storeh_epi64((__m128i *)q, a0); q += dstStride; - + rowCount -= 2; } while (rowCount != 0); - + colCount -= 8; dst += 8; } @@ -2625,178 +2625,178 @@ void BiPredClipping_SSSE3( void BiPredClippingOnTheFly_SSSE3( - EB_BYTE list0Src, - EB_U32 list0SrcStride, - EB_BYTE list1Src, - EB_U32 list1SrcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S32 offset, - EB_BOOL isLuma) + EB_BYTE list0Src, + EB_U32 list0SrcStride, + EB_BYTE list1Src, + EB_U32 list1SrcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S32 offset, + EB_BOOL isLuma) { - EB_U32 rowCount, colCount; - __m128i o; - o = (isLuma) ? _mm_set1_epi16(128 * 64) : _mm_set1_epi16(0); - - PrefetchBlock(list0Src, list0SrcStride, puWidth, puHeight); - PrefetchBlock(list1Src, list1SrcStride, puWidth, puHeight); - - if (puWidth & 2) - { - - EB_BYTE q = dst; - EB_BYTE ptrSrc0 = list0Src; - EB_BYTE ptrSrc1 = list1Src; - rowCount = puHeight; - __m128i a0, a2; - a0 = _mm_setzero_si128(); - a2 = _mm_setzero_si128(); - do - { - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 0); ptrSrc0 += list0SrcStride; - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 1); ptrSrc0 += list0SrcStride; - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 2); ptrSrc0 += list0SrcStride; - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 3); ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); - a0 = _mm_slli_epi16(a0, 6); - a0 = _mm_sub_epi16(a0, o); - - - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 0); ptrSrc1 += list1SrcStride; - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 1); ptrSrc1 += list1SrcStride; - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 2); ptrSrc1 += list1SrcStride; - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 3); ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); - a2 = _mm_slli_epi16(a2, 6); - a2 = _mm_sub_epi16(a2, o); - - a0 = _mm_adds_epi16(a0, a2); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); - a0 = _mm_srai_epi16(a0, 7); - a0 = _mm_packus_epi16(a0, a0); - - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 0)); q += dstStride; - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 1)); q += dstStride; - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 2)); q += dstStride; - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 3)); q += dstStride; - rowCount -= 4; - } while (rowCount != 0); - - puWidth -= 2; - if (puWidth == 0) - { - return; - } - - list0Src += 2; - list1Src += 2; - dst += 2; - } - - if (puWidth & 4) - { - - EB_BYTE q = dst; - EB_BYTE ptrSrc0 = list0Src; - EB_BYTE ptrSrc1 = list1Src; - rowCount = puHeight; - do - { - __m128i a0, a1, a2; - a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi32(a0, a1); - a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); - a0 = _mm_slli_epi16(a0, 6); - a0 = _mm_sub_epi16(a0, o); - - a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi32(a2, a1); - a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); - a2 = _mm_slli_epi16(a2, 6); - a2 = _mm_sub_epi16(a2, o); - - a0 = _mm_adds_epi16(a0, a2); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); - a0 = _mm_srai_epi16(a0, 7); - a0 = _mm_packus_epi16(a0, a0); - *(EB_U32 *)q = _mm_extract_epi32(a0, 0); q += dstStride; - *(EB_U32 *)q = _mm_extract_epi32(a0, 1); q += dstStride; - rowCount -= 2; - } while (rowCount != 0); - - puWidth -= 4; - if (puWidth == 0) - { - return; - } - - list0Src += 4; - list1Src += 4; - dst += 4; - } - - - colCount = puWidth; - do - { - EB_BYTE q = dst; - EB_BYTE ptrSrc0 = list0Src; - EB_BYTE ptrSrc1 = list1Src; - rowCount = puHeight; - do - { - __m128i a0, a1, a2, a3; - a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); - a0 = _mm_slli_epi16(a0, 6); - a0 = _mm_sub_epi16(a0, o); - - a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); - a2 = _mm_slli_epi16(a2, 6); - a2 = _mm_sub_epi16(a2, o); - - a0 = _mm_adds_epi16(a0, a2); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); - a0 = _mm_srai_epi16(a0, 7); - - - a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a1 = _mm_unpacklo_epi8(a1, _mm_setzero_si128()); - a1 = _mm_slli_epi16(a1, 6); - a1 = _mm_sub_epi16(a1, o); - a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); - a3 = _mm_slli_epi16(a3, 6); - a3 = _mm_sub_epi16(a3, o); - a1 = _mm_adds_epi16(a1, a3); - a1 = _mm_adds_epi16(a1, _mm_set1_epi16((short)offset)); - a1 = _mm_srai_epi16(a1, 7); - - a0 = _mm_packus_epi16(a0, a1); - _mm_storel_epi64((__m128i *)q, a0); - q += dstStride; - _mm_storeh_epi64((__m128i *)q, a0); - q += dstStride; - - rowCount -= 2; - } while (rowCount != 0); - - colCount -= 8; - list0Src += 8; - list1Src += 8; - dst += 8; - } while (colCount != 0); + EB_U32 rowCount, colCount; + __m128i o; + o = (isLuma) ? _mm_set1_epi16(128 * 64) : _mm_set1_epi16(0); + + PrefetchBlock(list0Src, list0SrcStride, puWidth, puHeight); + PrefetchBlock(list1Src, list1SrcStride, puWidth, puHeight); + + if (puWidth & 2) + { + + EB_BYTE q = dst; + EB_BYTE ptrSrc0 = list0Src; + EB_BYTE ptrSrc1 = list1Src; + rowCount = puHeight; + __m128i a0, a2; + a0 = _mm_setzero_si128(); + a2 = _mm_setzero_si128(); + do + { + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 0); ptrSrc0 += list0SrcStride; + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 1); ptrSrc0 += list0SrcStride; + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 2); ptrSrc0 += list0SrcStride; + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 3); ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); + a0 = _mm_slli_epi16(a0, 6); + a0 = _mm_sub_epi16(a0, o); + + + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 0); ptrSrc1 += list1SrcStride; + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 1); ptrSrc1 += list1SrcStride; + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 2); ptrSrc1 += list1SrcStride; + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 3); ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); + a2 = _mm_slli_epi16(a2, 6); + a2 = _mm_sub_epi16(a2, o); + + a0 = _mm_adds_epi16(a0, a2); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); + a0 = _mm_srai_epi16(a0, 7); + a0 = _mm_packus_epi16(a0, a0); + + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 0)); q += dstStride; + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 1)); q += dstStride; + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 2)); q += dstStride; + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 3)); q += dstStride; + rowCount -= 4; + } while (rowCount != 0); + + puWidth -= 2; + if (puWidth == 0) + { + return; + } + + list0Src += 2; + list1Src += 2; + dst += 2; + } + + if (puWidth & 4) + { + + EB_BYTE q = dst; + EB_BYTE ptrSrc0 = list0Src; + EB_BYTE ptrSrc1 = list1Src; + rowCount = puHeight; + do + { + __m128i a0, a1, a2; + a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi32(a0, a1); + a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); + a0 = _mm_slli_epi16(a0, 6); + a0 = _mm_sub_epi16(a0, o); + + a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi32(a2, a1); + a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); + a2 = _mm_slli_epi16(a2, 6); + a2 = _mm_sub_epi16(a2, o); + + a0 = _mm_adds_epi16(a0, a2); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); + a0 = _mm_srai_epi16(a0, 7); + a0 = _mm_packus_epi16(a0, a0); + *(EB_U32 *)q = _mm_extract_epi32(a0, 0); q += dstStride; + *(EB_U32 *)q = _mm_extract_epi32(a0, 1); q += dstStride; + rowCount -= 2; + } while (rowCount != 0); + + puWidth -= 4; + if (puWidth == 0) + { + return; + } + + list0Src += 4; + list1Src += 4; + dst += 4; + } + + + colCount = puWidth; + do + { + EB_BYTE q = dst; + EB_BYTE ptrSrc0 = list0Src; + EB_BYTE ptrSrc1 = list1Src; + rowCount = puHeight; + do + { + __m128i a0, a1, a2, a3; + a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); + a0 = _mm_slli_epi16(a0, 6); + a0 = _mm_sub_epi16(a0, o); + + a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); + a2 = _mm_slli_epi16(a2, 6); + a2 = _mm_sub_epi16(a2, o); + + a0 = _mm_adds_epi16(a0, a2); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); + a0 = _mm_srai_epi16(a0, 7); + + + a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a1 = _mm_unpacklo_epi8(a1, _mm_setzero_si128()); + a1 = _mm_slli_epi16(a1, 6); + a1 = _mm_sub_epi16(a1, o); + a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); + a3 = _mm_slli_epi16(a3, 6); + a3 = _mm_sub_epi16(a3, o); + a1 = _mm_adds_epi16(a1, a3); + a1 = _mm_adds_epi16(a1, _mm_set1_epi16((short)offset)); + a1 = _mm_srai_epi16(a1, 7); + + a0 = _mm_packus_epi16(a0, a1); + _mm_storel_epi64((__m128i *)q, a0); + q += dstStride; + _mm_storeh_epi64((__m128i *)q, a0); + q += dstStride; + + rowCount -= 2; + } while (rowCount != 0); + + colCount -= 8; + list0Src += 8; + list1Src += 8; + dst += 8; + } while (colCount != 0); } @@ -2809,7 +2809,7 @@ void LumaInterpolationFilterPosnOutRaw_SSSE3( EB_S16 *firstPassIFDst) { (void)firstPassIFDst; - + LumaInterpolationFilterOneDOutRawVertical_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 3); } diff --git a/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h b/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h index ba5fce2e4..113be1873 100644 --- a/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h @@ -57,18 +57,18 @@ void LumaInterpolationFilterPosrOutRaw_SSSE3(EB_BYTE refPic, EB_U32 srcStride, E void BiPredClipping_SSSE3(EB_U32 puWidth, EB_U32 puHeight, EB_S16 *list0Src, EB_S16 *list1Src, EB_BYTE dst, EB_U32 dstStride, EB_S32 offset); void BiPredClippingOnTheFly_SSSE3( - EB_BYTE list0Src, - EB_U32 list0SrcStride, - EB_BYTE list1Src, - EB_U32 list1SrcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S32 offset, - EB_BOOL isLuma); + EB_BYTE list0Src, + EB_U32 list0SrcStride, + EB_BYTE list1Src, + EB_U32 list1SrcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S32 offset, + EB_BOOL isLuma); #ifdef __cplusplus } #endif -#endif //EBMCP_SSSE3_H \ No newline at end of file +#endif //EBMCP_SSSE3_H diff --git a/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c index 01b5f947c..764bb86bc 100644 --- a/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c @@ -32,39 +32,39 @@ EB_ERRORTYPE SAOApplyBO_BT_SSSE3( __m128i band; __m128i offsets; EB_U8 *ptr; - + band = _mm_cvtsi32_si128(saoBandPosition); band = _mm_unpacklo_epi8(band, band); band = _mm_unpacklo_epi16(band, band); band = _mm_shuffle_epi32(band, 0x00); - + offsets = _mm_cvtsi32_si128(*(EB_U32 *)saoOffsetPtr); - + if (lcuWidth & 8) { rowCount = lcuHeight; ptr = reconSamplePtr; - + do { __m128i x0, x1; x0 = _mm_loadl_epi64( (__m128i *)ptr); ptr += reconStride; x0 = _mm_loadh_epi64(x0, (__m128i *)ptr); ptr -= reconStride; - + x1 = _mm_srli_epi16(x0, 3); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_sub_epi8(x1, band); x1 = _mm_and_si128(x1, _mm_set1_epi8(31)); x0 = _mm_adds_epi8(x0, _mm_and_si128(_mm_shuffle_epi8(offsets, x1), _mm_cmplt_epi8(x1, _mm_set1_epi8(4)))); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); - + _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; _mm_storeh_epi64((__m128i *)ptr, x0); ptr += reconStride; - + rowCount -= 2; } while (rowCount > 0); - + lcuWidth -= 8; if (lcuWidth == 0) { @@ -72,7 +72,7 @@ EB_ERRORTYPE SAOApplyBO_BT_SSSE3( } reconSamplePtr += 8; } - + colCount = lcuWidth; do { @@ -81,27 +81,27 @@ EB_ERRORTYPE SAOApplyBO_BT_SSSE3( do { __m128i x0, x1; - + x0 = _mm_loadu_si128((__m128i *)ptr); - + x1 = _mm_srli_epi16(x0, 3); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_sub_epi8(x1, band); x1 = _mm_and_si128(x1, _mm_set1_epi8(31)); x0 = _mm_adds_epi8(x0, _mm_and_si128(_mm_shuffle_epi8(offsets, x1), _mm_cmplt_epi8(x1, _mm_set1_epi8(4)))); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); - + _mm_storeu_si128((__m128i *)ptr, x0); - + ptr += reconStride; } while (--rowCount); - + reconSamplePtr += 16; colCount -= 16; } while (colCount > 0); - + return EB_ErrorNone; } @@ -111,7 +111,7 @@ static __m128i SAOEdgeProcess(__m128i x0, __m128i x1, __m128i x2, __m128i offset c1 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x1), _mm_cmpgt_epi8(x0, x1)); c2 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x2), _mm_cmpgt_epi8(x0, x2)); c0 = _mm_add_epi8(c1, c2); - + x0 = _mm_adds_epi8(x0, _mm_shuffle_epi8(offsets, _mm_add_epi8(c0, _mm_set1_epi8(2)))); return x0; @@ -127,20 +127,20 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( { __m128i offsets; EB_S32 rowCount, colCount, rowCountInner; - + offsets = _mm_loadl_epi64((__m128i *)saoOffsetPtr); // 0 1 x 2 3 x ... - + rowCount = lcuHeight; do { __m128i left; EB_BYTE basePtr = reconSamplePtr; - + left = _mm_loadu_si128((__m128i *)temporalBufferLeft); temporalBufferLeft += 16; left = _mm_xor_si128(left, _mm_set1_epi8(-128)); - + colCount = lcuWidth; - + if (colCount & 8) { EB_BYTE ptr = basePtr; @@ -156,7 +156,7 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( do { __m128i x0, x1, x2; - + x0 = _mm_loadl_epi64((__m128i *)ptr); x1 = _mm_loadl_epi64((__m128i *)(ptr+1)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); @@ -165,9 +165,9 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( x2 = _mm_or_si128(x2, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(_mm_slli_si128(x0, 8), _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; @@ -176,7 +176,7 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( colCount -= 8; basePtr += 8; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -186,23 +186,23 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + while (colCount > 0) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + do { __m128i x0, x1, x2; - + x0 = _mm_loadu_si128((__m128i *)ptr); x1 = _mm_loadu_si128((__m128i *)(ptr+1)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); @@ -211,7 +211,7 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( x2 = _mm_or_si128(x2, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(x0, _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); @@ -219,10 +219,10 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( ptr += reconStride; } while (--rowCountInner); - + colCount -= 16; basePtr += 16; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -232,12 +232,12 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + rowCount -= 16; reconSamplePtr += 16 * reconStride; } while (rowCount > 0); - + return EB_ErrorNone; } @@ -260,7 +260,7 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( { ptr = reconSamplePtr; rowCount = lcuHeight; - + x2 = _mm_loadl_epi64((__m128i *)temporalBufferUpper); temporalBufferUpper += 8; x2 = _mm_loadh_epi64(x2, (__m128i *)ptr); ptr += reconStride; x2 = _mm_xor_si128(x2, _mm_set1_epi8(-128)); @@ -269,23 +269,23 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( x1 = _mm_loadl_epi64((__m128i *)ptr); x1 = _mm_loadh_epi64(x1, (__m128i *)(ptr + reconStride)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); - + x0 = _mm_or_si128(_mm_slli_si128(x1, 8), _mm_srli_si128(x2, 8)); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); - + _mm_storel_epi64((__m128i *)(ptr - reconStride), x0); _mm_storeh_epi64((__m128i *)ptr, x0); ptr += reconStride; ptr += reconStride; - + x2 = x1; rowCount -= 2; } while (rowCount > 0); - + lcuWidth -= 8; if (lcuWidth == 0) { @@ -293,12 +293,12 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( } reconSamplePtr += 8; } - + colCount = lcuWidth; do { ptr = reconSamplePtr; - + x2 = _mm_loadu_si128((__m128i *)temporalBufferUpper); temporalBufferUpper += 16; x0 = _mm_loadu_si128((__m128i *)ptr); x2 = _mm_xor_si128(x2, _mm_set1_epi8(-128)); @@ -316,12 +316,12 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( _mm_storeu_si128((__m128i *)ptr, r0); ptr += reconStride; - + x2 = x0; x0 = x1; } while (--rowCount); - + colCount -= 16; reconSamplePtr += 16; } @@ -336,19 +336,19 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( EB_U8 *temporalBufferLeft, EB_U8 *temporalBufferUpper, EB_S8 *saoOffsetPtr, - EB_U32 lcuHeight, + EB_U32 lcuHeight, EB_U32 lcuWidth ) { __m128i offsets; EB_S32 rowCount, colCount, rowCountInner; EB_U32 /*EB_S32*/ colIdx; - + EB_U8 bufferAbove[MAX_LCU_SIZE]; - + colIdx = 0; temporalBufferUpper--; - + if (lcuWidth & 8) { __m128i x0 = _mm_loadl_epi64((__m128i *)temporalBufferUpper); @@ -363,66 +363,66 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( _mm_storeu_si128((__m128i *)(bufferAbove + colIdx), x0); colIdx += 16; } - + offsets = _mm_loadl_epi64((__m128i *)saoOffsetPtr); // 0 1 x 2 3 x ... - + rowCount = lcuHeight; do { __m128i left, up; EB_BYTE basePtr = reconSamplePtr; EB_BYTE upPtr = bufferAbove; - + left = _mm_loadu_si128((__m128i *)temporalBufferLeft); temporalBufferLeft += 16; left = _mm_xor_si128(left, _mm_set1_epi8(-128)); - + colCount = lcuWidth; - + if (colCount & 8) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadl_epi64((__m128i *)upPtr); do { __m128i x0, x1, x2; - + x0 = _mm_loadl_epi64((__m128i *)ptr); x1 = _mm_loadl_epi64((__m128i *)(ptr+1+reconStride)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); - + x2 = up; - + up = _mm_slli_si128(x0, 1); up = _mm_or_si128(up, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(_mm_slli_si128(x0,8), _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storel_epi64((__m128i *)upPtr, up); colCount -= 8; basePtr += 8; upPtr += 8; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -432,52 +432,52 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + while (colCount > 0) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadu_si128((__m128i *)upPtr); - + do { __m128i x0, x1, x2; - + x0 = _mm_loadu_si128((__m128i *)ptr); x1 = _mm_loadu_si128((__m128i *)(ptr+1+reconStride)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); - + x2 = up; - + up = _mm_slli_si128(x0, 1); up = _mm_or_si128(up, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(x0, _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storeu_si128((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storeu_si128((__m128i *)upPtr, up); - + colCount -= 16; basePtr += 16; upPtr += 16; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -487,12 +487,12 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + rowCount -= 16; reconSamplePtr += 16 * reconStride; } while (rowCount > 0); - + return EB_ErrorNone; } @@ -511,13 +511,13 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( __m128i down; EB_U8 bufferAbove[MAX_LCU_SIZE]; - + colIdx = 0; temporalBufferUpper++; temporalBufferLeft++; - + if (lcuWidth & 8) { __m128i x0 = _mm_loadl_epi64((__m128i *)temporalBufferUpper); @@ -532,33 +532,33 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( _mm_storeu_si128((__m128i *)(bufferAbove + colIdx), x0); colIdx += 16; } - + offsets = _mm_loadl_epi64((__m128i *)saoOffsetPtr); // 0 1 x 2 3 x ... - + rowCount = lcuHeight; do { __m128i left, up; EB_BYTE basePtr = reconSamplePtr; EB_BYTE upPtr = bufferAbove; - + left = _mm_loadu_si128((__m128i *)temporalBufferLeft); temporalBufferLeft += 16; left = _mm_xor_si128(left, _mm_set1_epi8(-128)); - + colCount = lcuWidth; - + if (colCount & 8) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadl_epi64((__m128i *)upPtr); down = _mm_loadl_epi64((__m128i *)ptr); down = _mm_xor_si128(down, _mm_set1_epi8(-128)); @@ -566,37 +566,37 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( do { __m128i x0, x1, x2; - + x0 = down; x1 = _mm_loadl_epi64((__m128i *)(ptr+reconStride)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); down = x1; - + x2 = up; - + x1 = _mm_slli_si128(x1, 1); x1 = _mm_or_si128(x1, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(_mm_slli_si128(down,8), _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + up = _mm_loadl_epi64((__m128i *)(ptr + 1)); up = _mm_xor_si128(up, _mm_set1_epi8(-128)); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storel_epi64((__m128i *)upPtr, up); - + colCount -= 8; basePtr += 8; upPtr += 8; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -606,57 +606,57 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + while (colCount > 0) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadu_si128((__m128i *)upPtr); down = _mm_loadu_si128((__m128i *)ptr); down = _mm_xor_si128(down, _mm_set1_epi8(-128)); - + do { __m128i x0, x1, x2; - + x0 = down; x1 = _mm_loadu_si128((__m128i *)(ptr+reconStride)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); down = x1; - + x2 = up; - + x1 = _mm_slli_si128(x1, 1); x1 = _mm_or_si128(x1, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(down, _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); up = _mm_loadu_si128((__m128i *)(ptr + 1)); up = _mm_xor_si128(up, _mm_set1_epi8(-128)); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storeu_si128((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storeu_si128((__m128i *)upPtr, up); - + colCount -= 16; basePtr += 16; upPtr += 16; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -666,12 +666,12 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + rowCount -= 16; reconSamplePtr += 16 * reconStride; } while (rowCount > 0); - + return EB_ErrorNone; } diff --git a/Source/Lib/ASM_SSSE3/EbSaoApplication_SSSE3.h b/Source/Lib/ASM_SSSE3/EbSaoApplication_SSSE3.h index 2bcfa72de..32403b417 100644 --- a/Source/Lib/ASM_SSSE3/EbSaoApplication_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbSaoApplication_SSSE3.h @@ -57,4 +57,4 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c index bebd0fa26..8acf012e7 100644 --- a/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c @@ -49,7 +49,7 @@ static void transpose16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ { __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; - + a0 = _mm_loadu_si128((const __m128i *)(src + (8*i+0)*src_stride + 8*j)); a1 = _mm_loadu_si128((const __m128i *)(src + (8*i+1)*src_stride + 8*j)); a2 = _mm_loadu_si128((const __m128i *)(src + (8*i+2)*src_stride + 8*j)); @@ -58,7 +58,7 @@ static void transpose16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ a5 = _mm_loadu_si128((const __m128i *)(src + (8*i+5)*src_stride + 8*j)); a6 = _mm_loadu_si128((const __m128i *)(src + (8*i+6)*src_stride + 8*j)); a7 = _mm_loadu_si128((const __m128i *)(src + (8*i+7)*src_stride + 8*j)); - + b0 = _mm_unpacklo_epi16(a0, a4); b1 = _mm_unpacklo_epi16(a1, a5); b2 = _mm_unpacklo_epi16(a2, a6); @@ -67,7 +67,7 @@ static void transpose16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ b5 = _mm_unpackhi_epi16(a1, a5); b6 = _mm_unpackhi_epi16(a2, a6); b7 = _mm_unpackhi_epi16(a3, a7); - + a0 = _mm_unpacklo_epi16(b0, b2); a1 = _mm_unpacklo_epi16(b1, b3); a2 = _mm_unpackhi_epi16(b0, b2); @@ -76,7 +76,7 @@ static void transpose16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ a5 = _mm_unpacklo_epi16(b5, b7); a6 = _mm_unpackhi_epi16(b4, b6); a7 = _mm_unpackhi_epi16(b5, b7); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpackhi_epi16(a0, a1); b2 = _mm_unpacklo_epi16(a2, a3); @@ -85,7 +85,7 @@ static void transpose16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ b5 = _mm_unpackhi_epi16(a4, a5); b6 = _mm_unpacklo_epi16(a6, a7); b7 = _mm_unpackhi_epi16(a6, a7); - + _mm_storeu_si128((__m128i *)(dst + (8*j+0)*dst_stride + 8*i), b0); _mm_storeu_si128((__m128i *)(dst + (8*j+1)*dst_stride + 8*i), b1); _mm_storeu_si128((__m128i *)(dst + (8*j+2)*dst_stride + 8*i), b2); @@ -102,14 +102,14 @@ static void transpose16Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U { EB_U32 j; EB_U32 numRows = 2 - (pattern & 1); - + do { for (j = 0; j < 2; j++) { __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; - + a0 = _mm_loadu_si128((const __m128i *)(src + (0)*src_stride + 8*j)); a1 = _mm_loadu_si128((const __m128i *)(src + (1)*src_stride + 8*j)); a2 = _mm_loadu_si128((const __m128i *)(src + (2)*src_stride + 8*j)); @@ -118,7 +118,7 @@ static void transpose16Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U a5 = _mm_loadu_si128((const __m128i *)(src + (5)*src_stride + 8*j)); a6 = _mm_loadu_si128((const __m128i *)(src + (6)*src_stride + 8*j)); a7 = _mm_loadu_si128((const __m128i *)(src + (7)*src_stride + 8*j)); - + b0 = _mm_unpacklo_epi16(a0, a4); b1 = _mm_unpacklo_epi16(a1, a5); b2 = _mm_unpacklo_epi16(a2, a6); @@ -127,7 +127,7 @@ static void transpose16Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U b5 = _mm_unpackhi_epi16(a1, a5); b6 = _mm_unpackhi_epi16(a2, a6); b7 = _mm_unpackhi_epi16(a3, a7); - + a0 = _mm_unpacklo_epi16(b0, b2); a1 = _mm_unpacklo_epi16(b1, b3); a2 = _mm_unpackhi_epi16(b0, b2); @@ -136,7 +136,7 @@ static void transpose16Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U a5 = _mm_unpacklo_epi16(b5, b7); a6 = _mm_unpackhi_epi16(b4, b6); a7 = _mm_unpackhi_epi16(b5, b7); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpackhi_epi16(a0, a1); b2 = _mm_unpacklo_epi16(a2, a3); @@ -145,7 +145,7 @@ static void transpose16Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U b5 = _mm_unpackhi_epi16(a4, a5); b6 = _mm_unpacklo_epi16(a6, a7); b7 = _mm_unpackhi_epi16(a6, a7); - + _mm_storeu_si128((__m128i *)(dst + (8*j+0)*dst_stride), b0); _mm_storeu_si128((__m128i *)(dst + (8*j+1)*dst_stride), b1); _mm_storeu_si128((__m128i *)(dst + (8*j+2)*dst_stride), b2); @@ -155,7 +155,7 @@ static void transpose16Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U _mm_storeu_si128((__m128i *)(dst + (8*j+6)*dst_stride), b6); _mm_storeu_si128((__m128i *)(dst + (8*j+7)*dst_stride), b7); } - + src += 8*src_stride; dst += 8; } @@ -175,7 +175,7 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; __m128i c0; - + a0 = _mm_loadu_si128((const __m128i *)(src + (8*i+0)*src_stride + 8*j)); a1 = _mm_loadu_si128((const __m128i *)(src + (8*i+1)*src_stride + 8*j)); a2 = _mm_loadu_si128((const __m128i *)(src + (8*i+2)*src_stride + 8*j)); @@ -184,7 +184,7 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB a5 = _mm_loadu_si128((const __m128i *)(src + (8*i+5)*src_stride + 8*j)); a6 = _mm_loadu_si128((const __m128i *)(src + (8*i+6)*src_stride + 8*j)); a7 = _mm_loadu_si128((const __m128i *)(src + (8*i+7)*src_stride + 8*j)); - + c0 = _mm_or_si128(a0, a4); c0 = _mm_or_si128(c0, a1); c0 = _mm_or_si128(c0, a5); @@ -192,11 +192,11 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB c0 = _mm_or_si128(c0, a6); c0 = _mm_or_si128(c0, a3); c0 = _mm_or_si128(c0, a7); - + c0 = _mm_cmpeq_epi8(c0, _mm_setzero_si128()); - + zeroPattern = 2 * zeroPattern + ((_mm_movemask_epi8(c0)+1) >> 16); // add a '1' bit if all zeros - + b0 = _mm_unpacklo_epi16(a0, a4); b1 = _mm_unpacklo_epi16(a1, a5); b2 = _mm_unpacklo_epi16(a2, a6); @@ -205,7 +205,7 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB b5 = _mm_unpackhi_epi16(a1, a5); b6 = _mm_unpackhi_epi16(a2, a6); b7 = _mm_unpackhi_epi16(a3, a7); - + a0 = _mm_unpacklo_epi16(b0, b2); a1 = _mm_unpacklo_epi16(b1, b3); a2 = _mm_unpackhi_epi16(b0, b2); @@ -214,7 +214,7 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB a5 = _mm_unpacklo_epi16(b5, b7); a6 = _mm_unpackhi_epi16(b4, b6); a7 = _mm_unpackhi_epi16(b5, b7); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpackhi_epi16(a0, a1); b2 = _mm_unpacklo_epi16(a2, a3); @@ -223,7 +223,7 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB b5 = _mm_unpackhi_epi16(a4, a5); b6 = _mm_unpacklo_epi16(a6, a7); b7 = _mm_unpackhi_epi16(a6, a7); - + _mm_storeu_si128((__m128i *)(dst + (8*j+0)*dst_stride + 8*i), b0); _mm_storeu_si128((__m128i *)(dst + (8*j+1)*dst_stride + 8*i), b1); _mm_storeu_si128((__m128i *)(dst + (8*j+2)*dst_stride + 8*i), b2); @@ -234,7 +234,7 @@ static EB_U32 transpose16Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB _mm_storeu_si128((__m128i *)(dst + (8*j+7)*dst_stride + 8*i), b7); } } - + if ((zeroPattern & 3) == 3) result |= 1; // can do half transforms 1st pass if ((zeroPattern & 5) == 5) result |= 2; // can do half rows 1st pass, and half transforms 2nd pass return result; @@ -247,55 +247,55 @@ static void transform16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl; - + for (i = 0; i < 16; i++) { __m128i x0, x1; __m128i y0, y1; __m128i a0, a1, a2, a3; __m128i b0, b1, b2, b3; - + y0 = _mm_loadu_si128((const __m128i *)(src+i*src_stride+0x00)); y1 = _mm_loadu_si128((const __m128i *)(src+i*src_stride+0x08)); - - + + // 16-point butterfly y1 = reverse_epi16(y1); - + x0 = _mm_add_epi16(y0, y1); x1 = _mm_sub_epi16(y0, y1); - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); - + x0 = _mm_packs_epi32(b0, b1); x1 = _mm_packs_epi32(b2, b3); - + y0 = _mm_unpacklo_epi16(x0, x1); y1 = _mm_unpackhi_epi16(x0, x1); - + _mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x00), y0); _mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x08), y1); } @@ -307,7 +307,7 @@ static void invTransform16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl2; - + do { __m128i x0, x1; @@ -315,7 +315,7 @@ static void invTransform16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d __m128i b0, b1, b2, b3; x0 = _mm_loadu_si128((const __m128i *)(src+0x00)); // 00 01 02 03 04 05 06 07 x1 = _mm_loadu_si128((const __m128i *)(src+0x08)); // 08 09 0a 0b 0c 0d 0e 0f - + #ifdef SSSE3/// __SSSE3__ x0 = _mm_shuffle_epi8(x0, _mm_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15)); x1 = _mm_shuffle_epi8(x1, _mm_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15)); @@ -325,51 +325,51 @@ static void invTransform16(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d x0 = _mm_shufflehi_epi16(x0, 0xd8); x1 = _mm_shufflehi_epi16(x1, 0xd8); #endif - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); // 00 02 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[2])); // 04 06 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[4])); // 08 0a a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[6])); // 0c 0e - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[3])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[5])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[7])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[12])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[13])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - + a0 = _mm_add_epi32(a0, o0); a1 = _mm_add_epi32(a1, o0); - + b0 = _mm_add_epi32(a0, a2); b1 = _mm_add_epi32(a1, a3); b2 = _mm_sub_epi32(a0, a2); b3 = _mm_sub_epi32(a1, a3); - + a0 = b0; a1 = b1; a2 = _mm_shuffle_epi32(b3, 0x1b); // 00011011 a3 = _mm_shuffle_epi32(b2, 0x1b); - + a0 = _mm_sra_epi32(a0, s0); a1 = _mm_sra_epi32(a1, s0); a2 = _mm_sra_epi32(a2, s0); a3 = _mm_sra_epi32(a3, s0); - + x0 = _mm_packs_epi32(a0, a1); x1 = _mm_packs_epi32(a2, a3); - + _mm_storeu_si128((__m128i *)(dst+0x00), x0); _mm_storeu_si128((__m128i *)(dst+0x08), x1); - + src += src_stride; dst += dst_stride; } @@ -382,57 +382,57 @@ static void invTransform16Half(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl2; - + do { __m128i x0, x1; __m128i a0, a1, a2, a3; __m128i b0, b1, b2, b3; x0 = _mm_loadu_si128((const __m128i *)(src+0x00)); // 00 01 02 03 04 05 06 07 - + #ifdef SSSE3/// __SSSE3__ x0 = _mm_shuffle_epi8(x0, _mm_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15)); #else x0 = _mm_shufflelo_epi16(x0, 0xd8); // 00 02 01 03 04 06 05 07 x0 = _mm_shufflehi_epi16(x0, 0xd8); #endif - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); // 00 02 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[2])); // 04 06 - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[3])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[10])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[11])); - + a0 = _mm_add_epi32(a0, o0); a1 = _mm_add_epi32(a1, o0); - + b0 = _mm_add_epi32(a0, a2); b1 = _mm_add_epi32(a1, a3); b2 = _mm_sub_epi32(a0, a2); b3 = _mm_sub_epi32(a1, a3); - + a0 = b0; a1 = b1; a2 = _mm_shuffle_epi32(b3, 0x1b); // 00011011 a3 = _mm_shuffle_epi32(b2, 0x1b); - + a0 = _mm_sra_epi32(a0, s0); a1 = _mm_sra_epi32(a1, s0); a2 = _mm_sra_epi32(a2, s0); a3 = _mm_sra_epi32(a3, s0); - + x0 = _mm_packs_epi32(a0, a1); x1 = _mm_packs_epi32(a2, a3); - + _mm_storeu_si128((__m128i *)(dst+0x00), x0); _mm_storeu_si128((__m128i *)(dst+0x08), x1); - + src += src_stride; dst += dst_stride; } @@ -476,7 +476,7 @@ static void transpose32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ { __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; - + a0 = _mm_loadu_si128((const __m128i *)(src + (8*i+0)*src_stride + 8*j)); a1 = _mm_loadu_si128((const __m128i *)(src + (8*i+1)*src_stride + 8*j)); a2 = _mm_loadu_si128((const __m128i *)(src + (8*i+2)*src_stride + 8*j)); @@ -485,7 +485,7 @@ static void transpose32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ a5 = _mm_loadu_si128((const __m128i *)(src + (8*i+5)*src_stride + 8*j)); a6 = _mm_loadu_si128((const __m128i *)(src + (8*i+6)*src_stride + 8*j)); a7 = _mm_loadu_si128((const __m128i *)(src + (8*i+7)*src_stride + 8*j)); - + b0 = _mm_unpacklo_epi16(a0, a4); b1 = _mm_unpacklo_epi16(a1, a5); b2 = _mm_unpacklo_epi16(a2, a6); @@ -494,7 +494,7 @@ static void transpose32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ b5 = _mm_unpackhi_epi16(a1, a5); b6 = _mm_unpackhi_epi16(a2, a6); b7 = _mm_unpackhi_epi16(a3, a7); - + a0 = _mm_unpacklo_epi16(b0, b2); a1 = _mm_unpacklo_epi16(b1, b3); a2 = _mm_unpackhi_epi16(b0, b2); @@ -503,7 +503,7 @@ static void transpose32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ a5 = _mm_unpacklo_epi16(b5, b7); a6 = _mm_unpackhi_epi16(b4, b6); a7 = _mm_unpackhi_epi16(b5, b7); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpackhi_epi16(a0, a1); b2 = _mm_unpacklo_epi16(a2, a3); @@ -512,7 +512,7 @@ static void transpose32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ b5 = _mm_unpackhi_epi16(a4, a5); b6 = _mm_unpacklo_epi16(a6, a7); b7 = _mm_unpackhi_epi16(a6, a7); - + _mm_storeu_si128((__m128i *)(dst + (8*j+0)*dst_stride + 8*i), b0); _mm_storeu_si128((__m128i *)(dst + (8*j+1)*dst_stride + 8*i), b1); _mm_storeu_si128((__m128i *)(dst + (8*j+2)*dst_stride + 8*i), b2); @@ -529,14 +529,14 @@ static void transpose32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U { EB_U32 j; EB_U32 numRows = 4 - (pattern & 3); - + do { for (j = 0; j < 4; j++) { __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; - + a0 = _mm_loadu_si128((const __m128i *)(src + (0)*src_stride + 8*j)); a1 = _mm_loadu_si128((const __m128i *)(src + (1)*src_stride + 8*j)); a2 = _mm_loadu_si128((const __m128i *)(src + (2)*src_stride + 8*j)); @@ -545,7 +545,7 @@ static void transpose32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U a5 = _mm_loadu_si128((const __m128i *)(src + (5)*src_stride + 8*j)); a6 = _mm_loadu_si128((const __m128i *)(src + (6)*src_stride + 8*j)); a7 = _mm_loadu_si128((const __m128i *)(src + (7)*src_stride + 8*j)); - + b0 = _mm_unpacklo_epi16(a0, a4); b1 = _mm_unpacklo_epi16(a1, a5); b2 = _mm_unpacklo_epi16(a2, a6); @@ -554,7 +554,7 @@ static void transpose32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U b5 = _mm_unpackhi_epi16(a1, a5); b6 = _mm_unpackhi_epi16(a2, a6); b7 = _mm_unpackhi_epi16(a3, a7); - + a0 = _mm_unpacklo_epi16(b0, b2); a1 = _mm_unpacklo_epi16(b1, b3); a2 = _mm_unpackhi_epi16(b0, b2); @@ -563,7 +563,7 @@ static void transpose32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U a5 = _mm_unpacklo_epi16(b5, b7); a6 = _mm_unpackhi_epi16(b4, b6); a7 = _mm_unpackhi_epi16(b5, b7); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpackhi_epi16(a0, a1); b2 = _mm_unpacklo_epi16(a2, a3); @@ -572,7 +572,7 @@ static void transpose32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U b5 = _mm_unpackhi_epi16(a4, a5); b6 = _mm_unpacklo_epi16(a6, a7); b7 = _mm_unpackhi_epi16(a6, a7); - + _mm_storeu_si128((__m128i *)(dst + (8*j+0)*dst_stride), b0); _mm_storeu_si128((__m128i *)(dst + (8*j+1)*dst_stride), b1); _mm_storeu_si128((__m128i *)(dst + (8*j+2)*dst_stride), b2); @@ -582,7 +582,7 @@ static void transpose32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U _mm_storeu_si128((__m128i *)(dst + (8*j+6)*dst_stride), b6); _mm_storeu_si128((__m128i *)(dst + (8*j+7)*dst_stride), b7); } - + src += 8 * src_stride; dst += 8; } @@ -594,7 +594,7 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB EB_U32 i, j; EB_U32 zeroPattern = 0; EB_U32 result = 0; - + for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) @@ -602,7 +602,7 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; __m128i c0; - + a0 = _mm_loadu_si128((const __m128i *)(src + (8*i+0)*src_stride + 8*j)); a1 = _mm_loadu_si128((const __m128i *)(src + (8*i+1)*src_stride + 8*j)); a2 = _mm_loadu_si128((const __m128i *)(src + (8*i+2)*src_stride + 8*j)); @@ -611,7 +611,7 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB a5 = _mm_loadu_si128((const __m128i *)(src + (8*i+5)*src_stride + 8*j)); a6 = _mm_loadu_si128((const __m128i *)(src + (8*i+6)*src_stride + 8*j)); a7 = _mm_loadu_si128((const __m128i *)(src + (8*i+7)*src_stride + 8*j)); - + c0 = _mm_or_si128(a0, a4); c0 = _mm_or_si128(c0, a1); c0 = _mm_or_si128(c0, a5); @@ -619,11 +619,11 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB c0 = _mm_or_si128(c0, a6); c0 = _mm_or_si128(c0, a3); c0 = _mm_or_si128(c0, a7); - + c0 = _mm_cmpeq_epi8(c0, _mm_setzero_si128()); - + zeroPattern = 2 * zeroPattern + ((_mm_movemask_epi8(c0)+1) >> 16); // add a '1' bit if all zeros - + b0 = _mm_unpacklo_epi16(a0, a4); b1 = _mm_unpacklo_epi16(a1, a5); b2 = _mm_unpacklo_epi16(a2, a6); @@ -632,7 +632,7 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB b5 = _mm_unpackhi_epi16(a1, a5); b6 = _mm_unpackhi_epi16(a2, a6); b7 = _mm_unpackhi_epi16(a3, a7); - + a0 = _mm_unpacklo_epi16(b0, b2); a1 = _mm_unpacklo_epi16(b1, b3); a2 = _mm_unpackhi_epi16(b0, b2); @@ -641,7 +641,7 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB a5 = _mm_unpacklo_epi16(b5, b7); a6 = _mm_unpackhi_epi16(b4, b6); a7 = _mm_unpackhi_epi16(b5, b7); - + b0 = _mm_unpacklo_epi16(a0, a1); b1 = _mm_unpackhi_epi16(a0, a1); b2 = _mm_unpacklo_epi16(a2, a3); @@ -650,7 +650,7 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB b5 = _mm_unpackhi_epi16(a4, a5); b6 = _mm_unpacklo_epi16(a6, a7); b7 = _mm_unpackhi_epi16(a6, a7); - + _mm_storeu_si128((__m128i *)(dst + (8*j+0)*dst_stride + 8*i), b0); _mm_storeu_si128((__m128i *)(dst + (8*j+1)*dst_stride + 8*i), b1); _mm_storeu_si128((__m128i *)(dst + (8*j+2)*dst_stride + 8*i), b2); @@ -661,15 +661,15 @@ static EB_U32 transpose32Check0s(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB _mm_storeu_si128((__m128i *)(dst + (8*j+7)*dst_stride + 8*i), b7); } } - + if ((zeroPattern & 0xfff) == 0xfff) result |= 3; else if ((zeroPattern & 0xff) == 0xff) result |= 2; else if ((zeroPattern & 0xf) == 0xf) result |= 1; - + if ((zeroPattern & 0x7777) == 0x7777) result |= 3*4; else if ((zeroPattern & 0x3333) == 0x3333) result |= 2*4; else if ((zeroPattern & 0x1111) == 0x1111) result |= 1*4; - + return result; } @@ -679,7 +679,7 @@ static void transform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl; - + EB_U32 numRows = 32; do { @@ -692,25 +692,25 @@ static void transform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ x1 = _mm_loadu_si128((const __m128i *)(src+0x08)); x2 = _mm_loadu_si128((const __m128i *)(src+0x10)); x3 = _mm_loadu_si128((const __m128i *)(src+0x18)); - - + + // 32-point butterfly x2 = reverse_epi16(x2); x3 = reverse_epi16(x3); - + y0 = _mm_add_epi16(x0, x3); y1 = _mm_add_epi16(x1, x2); - + y2 = _mm_sub_epi16(x0, x3); y3 = _mm_sub_epi16(x1, x2); - + // 16-point butterfly y1 = reverse_epi16(y1); - + x0 = _mm_add_epi16(y0, y1); x1 = _mm_sub_epi16(y0, y1); - - + + x2 = y2; x3 = y3; @@ -728,7 +728,7 @@ static void transform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); @@ -760,7 +760,7 @@ static void transform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); @@ -778,12 +778,12 @@ static void transform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); - + x0 = _mm_packs_epi32(b0, b1); x1 = _mm_packs_epi32(b2, b3); x2 = _mm_packs_epi32(b4, b5); x3 = _mm_packs_epi32(b6, b7); - + y0 = _mm_unpacklo_epi16(x0, x1); y1 = _mm_unpackhi_epi16(x0, x1); y2 = x2; @@ -792,12 +792,12 @@ static void transform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_ x1 = _mm_unpackhi_epi16(y0, y2); x2 = _mm_unpacklo_epi16(y1, y3); x3 = _mm_unpackhi_epi16(y1, y3); - + _mm_storeu_si128((__m128i *)(dst+0x00), x0); _mm_storeu_si128((__m128i *)(dst+0x08), x1); _mm_storeu_si128((__m128i *)(dst+0x10), x2); _mm_storeu_si128((__m128i *)(dst+0x18), x3); - + src += src_stride; dst += dst_stride; } @@ -834,7 +834,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[2])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[4])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[6])); - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[3])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[5])); @@ -844,12 +844,12 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[12])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[14])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[13])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[15])); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[16]); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[20])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[24])); @@ -876,7 +876,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[38])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[27])); @@ -891,42 +891,42 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d y1 = _mm_unpackhi_epi16(x0, x1); // 04 0c 05 0d 06 0e 07 0f y2 = _mm_unpacklo_epi16(x2, x3); // 10 18 y3 = _mm_unpackhi_epi16(x2, x3); // 24 2c - + x0 = _mm_unpacklo_epi16(y0, y1); // 00 04 08 0c 01 05 09 0d x1 = _mm_unpackhi_epi16(y0, y1); // 02 06 0a 0e 03 07 0b 0f x2 = _mm_unpacklo_epi16(y2, y3); // 10 14 x3 = _mm_unpackhi_epi16(y2, y3); // 12 16 - + y0 = _mm_unpacklo_epi64(x0, x2); // 00 04 08 0c 10 14 18 1c y1 = _mm_unpacklo_epi64(x1, x3); // 02 06 0a 0e 12 16 1a 1e y2 = _mm_unpackhi_epi16(x0, x1); // 01 03 05 07 09 0b 0d 0f y3 = _mm_unpackhi_epi16(x2, x3); // 11 13 15 17 19 1b 1d 1f - + x0 = y0; x1 = y1; x2 = y2; x3 = y3; - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); // 00 04 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); // 08 0c a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); // 10 14 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); // 18 1c - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); // 02 06 a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); // 0a 0e a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); // 12 16 a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); // 1a 1e - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); // 01 03 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); // 05 07 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); // 09 0b @@ -935,7 +935,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); // 15 17 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); // 19 1b a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); // 1d 1f - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); @@ -944,7 +944,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); @@ -953,7 +953,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); @@ -963,15 +963,15 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); #endif - + a0 = _mm_add_epi32(a0, o0); a1 = _mm_add_epi32(a1, o0); - + b0 = _mm_add_epi32(a0, a2); b1 = _mm_add_epi32(a1, a3); b2 = _mm_sub_epi32(a0, a2); b3 = _mm_sub_epi32(a1, a3); - + a0 = b0; a1 = b1; a2 = _mm_shuffle_epi32(b3, 0x1b); // 00011011 @@ -985,7 +985,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d b5 = _mm_sub_epi32(a1, a5); b6 = _mm_sub_epi32(a2, a6); b7 = _mm_sub_epi32(a3, a7); - + a0 = _mm_sra_epi32(b0, s0); a1 = _mm_sra_epi32(b1, s0); a2 = _mm_sra_epi32(b2, s0); @@ -994,7 +994,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d a5 = _mm_sra_epi32(_mm_shuffle_epi32(b6, 0x1b), s0); a6 = _mm_sra_epi32(_mm_shuffle_epi32(b5, 0x1b), s0); a7 = _mm_sra_epi32(_mm_shuffle_epi32(b4, 0x1b), s0); - + x0 = _mm_packs_epi32(a0, a1); x1 = _mm_packs_epi32(a2, a3); x2 = _mm_packs_epi32(a4, a5); @@ -1004,7 +1004,7 @@ static void invTransform32(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 d _mm_storeu_si128((__m128i *)(dst+0x08), x1); _mm_storeu_si128((__m128i *)(dst+0x10), x2); _mm_storeu_si128((__m128i *)(dst+0x18), x3); - + src += src_stride; dst += dst_stride; } @@ -1016,7 +1016,7 @@ static void invTransform32ThreeQuarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *d __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl2; - + do { __m128i x0, x1, x2, x3; @@ -1029,114 +1029,114 @@ static void invTransform32ThreeQuarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *d x1 = _mm_loadu_si128((const __m128i *)(src+0x08)); // 08 09 0a 0b 0c 0d 0e 0f x2 = _mm_loadu_si128((const __m128i *)(src+0x10)); // 10 11 12 13 14 15 16 17 x3 = _mm_setzero_si128(); - + #ifdef SSSE3/// __SSSE3__ x0 = _mm_shuffle_epi8(x0, _mm_setr_epi8(0, 1, 8, 9, 4, 5, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15)); // 00 04 02 06 01 03 05 07 x1 = _mm_shuffle_epi8(x1, _mm_setr_epi8(0, 1, 8, 9, 4, 5, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15)); // 08 0c 0a 0e 09 0b 0d 0f x2 = _mm_shuffle_epi8(x2, _mm_setr_epi8(0, 1, 8, 9, 4, 5, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15)); // 10 14 12 16 11 13 15 17 - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[2])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[4])); - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[3])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[5])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[12])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[13])); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[16]); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[20])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[24])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[28])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[32])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[36])); - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[21])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[25])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[29])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[33])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[37])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[22])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[26])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[30])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[34])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[38])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[27])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[31])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[35])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[39])); - + #else y0 = _mm_unpacklo_epi16(x0, x1); // 00 08 01 09 02 0a 03 0b y1 = _mm_unpackhi_epi16(x0, x1); // 04 0c 05 0d 06 0e 07 0f y2 = _mm_unpacklo_epi16(x2, x3); // 10 18 y3 = _mm_unpackhi_epi16(x2, x3); // 24 2c - + x0 = _mm_unpacklo_epi16(y0, y1); // 00 04 08 0c 01 05 09 0d x1 = _mm_unpackhi_epi16(y0, y1); // 02 06 0a 0e 03 07 0b 0f x2 = _mm_unpacklo_epi16(y2, y3); // 10 14 x3 = _mm_unpackhi_epi16(y2, y3); // 12 16 - + y0 = _mm_unpacklo_epi64(x0, x2); // 00 04 08 0c 10 14 18 1c y1 = _mm_unpacklo_epi64(x1, x3); // 02 06 0a 0e 12 16 1a 1e y2 = _mm_unpackhi_epi16(x0, x1); // 01 03 05 07 09 0b 0d 0f y3 = _mm_unpackhi_epi16(x2, x3); // 11 13 15 17 19 1b 1d 1f - + x0 = y0; x1 = y1; x2 = y2; x3 = y3; - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); // 00 04 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); // 08 0c a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); // 10 14 - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); // 02 06 a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); // 0a 0e a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); // 12 16 - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); // 01 03 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); // 05 07 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); // 09 0b a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); // 0d 0f a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); // 11 13 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); // 15 17 - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); @@ -1144,20 +1144,20 @@ static void invTransform32ThreeQuarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *d a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); #endif - + a0 = _mm_add_epi32(a0, o0); a1 = _mm_add_epi32(a1, o0); - + b0 = _mm_add_epi32(a0, a2); b1 = _mm_add_epi32(a1, a3); b2 = _mm_sub_epi32(a0, a2); b3 = _mm_sub_epi32(a1, a3); - + a0 = b0; a1 = b1; a2 = _mm_shuffle_epi32(b3, 0x1b); // 00011011 a3 = _mm_shuffle_epi32(b2, 0x1b); - + b0 = _mm_add_epi32(a0, a4); b1 = _mm_add_epi32(a1, a5); b2 = _mm_add_epi32(a2, a6); @@ -1166,7 +1166,7 @@ static void invTransform32ThreeQuarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *d b5 = _mm_sub_epi32(a1, a5); b6 = _mm_sub_epi32(a2, a6); b7 = _mm_sub_epi32(a3, a7); - + a0 = _mm_sra_epi32(b0, s0); a1 = _mm_sra_epi32(b1, s0); a2 = _mm_sra_epi32(b2, s0); @@ -1175,17 +1175,17 @@ static void invTransform32ThreeQuarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *d a5 = _mm_sra_epi32(_mm_shuffle_epi32(b6, 0x1b), s0); a6 = _mm_sra_epi32(_mm_shuffle_epi32(b5, 0x1b), s0); a7 = _mm_sra_epi32(_mm_shuffle_epi32(b4, 0x1b), s0); - + x0 = _mm_packs_epi32(a0, a1); x1 = _mm_packs_epi32(a2, a3); x2 = _mm_packs_epi32(a4, a5); x3 = _mm_packs_epi32(a6, a7); - + _mm_storeu_si128((__m128i *)(dst+0x00), x0); _mm_storeu_si128((__m128i *)(dst+0x08), x1); _mm_storeu_si128((__m128i *)(dst+0x10), x2); _mm_storeu_si128((__m128i *)(dst+0x18), x3); - + src += src_stride; dst += dst_stride; } @@ -1197,7 +1197,7 @@ static void invTransform32Half(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl2; - + do { __m128i x0, x1, x2, x3; @@ -1210,104 +1210,104 @@ static void invTransform32Half(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U x1 = _mm_loadu_si128((const __m128i *)(src+0x08)); // 08 09 0a 0b 0c 0d 0e 0f x2 = _mm_setzero_si128(); x3 = _mm_setzero_si128(); - + #ifdef SSSE3/// __SSSE3__ x0 = _mm_shuffle_epi8(x0, _mm_setr_epi8(0, 1, 8, 9, 4, 5, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15)); // 00 04 02 06 01 03 05 07 x1 = _mm_shuffle_epi8(x1, _mm_setr_epi8(0, 1, 8, 9, 4, 5, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15)); // 08 0c 0a 0e 09 0b 0d 0f - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[2])); - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[3])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[16]); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[20])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[24])); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[28])); - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[21])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[25])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[29])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[22])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[26])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[30])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[27])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[31])); - + #else y0 = _mm_unpacklo_epi16(x0, x1); // 00 08 01 09 02 0a 03 0b y1 = _mm_unpackhi_epi16(x0, x1); // 04 0c 05 0d 06 0e 07 0f - + x0 = _mm_unpacklo_epi16(y0, y1); // 00 04 08 0c 01 05 09 0d x1 = _mm_unpackhi_epi16(y0, y1); // 02 06 0a 0e 03 07 0b 0f - + y0 = _mm_unpacklo_epi64(x0, x2); // 00 04 08 0c 10 14 18 1c y1 = _mm_unpacklo_epi64(x1, x3); // 02 06 0a 0e 12 16 1a 1e y2 = _mm_unpackhi_epi16(x0, x1); // 01 03 05 07 09 0b 0d 0f - + x0 = y0; x1 = y1; x2 = y2; - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); // 00 04 a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); // 08 0c - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); // 02 06 a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); // 0a 0e - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); // 01 03 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); // 05 07 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); // 09 0b a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); // 0d 0f - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); #endif - + a0 = _mm_add_epi32(a0, o0); a1 = _mm_add_epi32(a1, o0); - + b0 = _mm_add_epi32(a0, a2); b1 = _mm_add_epi32(a1, a3); b2 = _mm_sub_epi32(a0, a2); b3 = _mm_sub_epi32(a1, a3); - + a0 = b0; a1 = b1; a2 = _mm_shuffle_epi32(b3, 0x1b); // 00011011 a3 = _mm_shuffle_epi32(b2, 0x1b); - + b0 = _mm_add_epi32(a0, a4); b1 = _mm_add_epi32(a1, a5); b2 = _mm_add_epi32(a2, a6); @@ -1316,7 +1316,7 @@ static void invTransform32Half(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U b5 = _mm_sub_epi32(a1, a5); b6 = _mm_sub_epi32(a2, a6); b7 = _mm_sub_epi32(a3, a7); - + a0 = _mm_sra_epi32(b0, s0); a1 = _mm_sra_epi32(b1, s0); a2 = _mm_sra_epi32(b2, s0); @@ -1325,17 +1325,17 @@ static void invTransform32Half(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U a5 = _mm_sra_epi32(_mm_shuffle_epi32(b6, 0x1b), s0); a6 = _mm_sra_epi32(_mm_shuffle_epi32(b5, 0x1b), s0); a7 = _mm_sra_epi32(_mm_shuffle_epi32(b4, 0x1b), s0); - + x0 = _mm_packs_epi32(a0, a1); x1 = _mm_packs_epi32(a2, a3); x2 = _mm_packs_epi32(a4, a5); x3 = _mm_packs_epi32(a6, a7); - + _mm_storeu_si128((__m128i *)(dst+0x00), x0); _mm_storeu_si128((__m128i *)(dst+0x08), x1); _mm_storeu_si128((__m128i *)(dst+0x10), x2); _mm_storeu_si128((__m128i *)(dst+0x18), x3); - + src += src_stride; dst += dst_stride; } @@ -1347,7 +1347,7 @@ static void invTransform32Quarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, E __m128i s0 = _mm_cvtsi32_si128(shift); __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)coeff_tbl2; - + do { __m128i x0, x1, x2, x3; @@ -1357,77 +1357,77 @@ static void invTransform32Quarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, E __m128i a0, a1, a2, a3, a4, a5, a6, a7; __m128i b0, b1, b2, b3, b4, b5, b6, b7; x0 = _mm_loadu_si128((const __m128i *)(src+0x00)); // 00 01 02 03 04 05 06 07 - + #ifdef SSSE3/// __SSSE3__ x0 = _mm_shuffle_epi8(x0, _mm_setr_epi8(0, 1, 8, 9, 4, 5, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15)); // 00 04 02 06 01 03 05 07 - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[8]); - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[9]); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[16]); a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[20])); - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[21])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[22])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[23])); #else y0 = _mm_unpacklo_epi16(x0, x0); // 00 08 01 09 02 0a 03 0b y1 = _mm_unpackhi_epi16(x0, x0); // 04 0c 05 0d 06 0e 07 0f - + x0 = _mm_unpacklo_epi16(y0, y1); // 00 04 08 0c 01 05 09 0d x1 = _mm_unpackhi_epi16(y0, y1); // 02 06 0a 0e 03 07 0b 0f - + y0 = _mm_unpacklo_epi64(x0, x0); // 00 04 08 0c 10 14 18 1c y1 = _mm_unpacklo_epi64(x1, x1); // 02 06 0a 0e 12 16 1a 1e x2 = _mm_unpackhi_epi16(x0, x1); // 01 03 05 07 09 0b 0d 0f - + x0 = y0; x1 = y1; - + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); // 00 04 - + a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); - + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); // 02 06 - + a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); - + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); // 01 03 a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); // 05 07 - + a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); - + a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); - + a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); #endif - + a0 = _mm_add_epi32(a0, o0); a1 = _mm_add_epi32(a1, o0); - + b0 = _mm_add_epi32(a0, a2); b1 = _mm_add_epi32(a1, a3); b2 = _mm_sub_epi32(a0, a2); b3 = _mm_sub_epi32(a1, a3); - + a0 = b0; a1 = b1; a2 = _mm_shuffle_epi32(b3, 0x1b); // 00011011 a3 = _mm_shuffle_epi32(b2, 0x1b); - + b0 = _mm_add_epi32(a0, a4); b1 = _mm_add_epi32(a1, a5); b2 = _mm_add_epi32(a2, a6); @@ -1436,7 +1436,7 @@ static void invTransform32Quarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, E b5 = _mm_sub_epi32(a1, a5); b6 = _mm_sub_epi32(a2, a6); b7 = _mm_sub_epi32(a3, a7); - + a0 = _mm_sra_epi32(b0, s0); a1 = _mm_sra_epi32(b1, s0); a2 = _mm_sra_epi32(b2, s0); @@ -1445,17 +1445,17 @@ static void invTransform32Quarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, E a5 = _mm_sra_epi32(_mm_shuffle_epi32(b6, 0x1b), s0); a6 = _mm_sra_epi32(_mm_shuffle_epi32(b5, 0x1b), s0); a7 = _mm_sra_epi32(_mm_shuffle_epi32(b4, 0x1b), s0); - + x0 = _mm_packs_epi32(a0, a1); x1 = _mm_packs_epi32(a2, a3); x2 = _mm_packs_epi32(a4, a5); x3 = _mm_packs_epi32(a6, a7); - + _mm_storeu_si128((__m128i *)(dst+0x00), x0); _mm_storeu_si128((__m128i *)(dst+0x08), x1); _mm_storeu_si128((__m128i *)(dst+0x10), x2); _mm_storeu_si128((__m128i *)(dst+0x18), x3); - + src += src_stride; dst += dst_stride; } @@ -1465,7 +1465,7 @@ static void invTransform32Quarter(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, E static void invTransform32Partial(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_stride, EB_U32 shift, EB_U32 pattern) { EB_U32 numRows = 32 - 2 * (pattern & 12); - + switch (pattern & 3) { case 3: @@ -1556,12 +1556,12 @@ void QuantizeInvQuantize4x4_SSE3( _mm_storel_epi64((__m128i *)(quantCoeff + coeffStride*row + 0), x); _mm_storel_epi64((__m128i *)(quantCoeff + coeffStride*row + coeffStride), _mm_srli_si128(x, 8)); - __m128i zer = _mm_setzero_si128(); - __m128i cmp = _mm_cmpeq_epi16(x, zer); - int msk = _mm_movemask_epi8(cmp); + __m128i zer = _mm_setzero_si128(); + __m128i cmp = _mm_cmpeq_epi16(x, zer); + int msk = _mm_movemask_epi8(cmp); - if (msk != 0xFFFF) - { + if (msk != 0xFFFF) + { a0 = _mm_mullo_epi16(x, iq); a1 = _mm_mulhi_epi16(x, iq); @@ -1577,11 +1577,11 @@ void QuantizeInvQuantize4x4_SSE3( x = _mm_packs_epi32(b0, b1); _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + 0), x); _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + coeffStride), _mm_srli_si128(x, 8)); - } - else{ - _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + 0), zer); - _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + coeffStride), zer); - } + } + else{ + _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + 0), zer); + _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + coeffStride), zer); + } row += 2; } while (row < 4); diff --git a/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h b/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h index 22642418f..68454660d 100644 --- a/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h @@ -10,7 +10,7 @@ #ifdef __cplusplus extern "C" { #endif - + void QuantizeInvQuantize4x4_SSE3( EB_S16 *coeff, const EB_U32 coeffStride, diff --git a/Source/Lib/C_DEFAULT/EbAvcStyleMcp_C.h b/Source/Lib/C_DEFAULT/EbAvcStyleMcp_C.h index eaf90a725..ed4ed313c 100644 --- a/Source/Lib/C_DEFAULT/EbAvcStyleMcp_C.h +++ b/Source/Lib/C_DEFAULT/EbAvcStyleMcp_C.h @@ -34,4 +34,4 @@ void WpAvcStyleLumaInterpolationFilterPosr(EB_BYTE refPic, EB_U32 srcStride, EB_ #ifdef __cplusplus } #endif -#endif //EBAVCSTYLEMCP_C_H \ No newline at end of file +#endif //EBAVCSTYLEMCP_C_H diff --git a/Source/Lib/C_DEFAULT/EbComputeMean_C.c b/Source/Lib/C_DEFAULT/EbComputeMean_C.c index eb8d1e9bc..ac1451144 100644 --- a/Source/Lib/C_DEFAULT/EbComputeMean_C.c +++ b/Source/Lib/C_DEFAULT/EbComputeMean_C.c @@ -79,7 +79,7 @@ EB_U64 ComputeSubMeanOfSquaredValues( EB_U64 blockMean = 0; EB_U16 skip = 0; - + for (verticalIndex = 0; skip < inputAreaHeight; skip =verticalIndex + verticalIndex) { for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex++) { diff --git a/Source/Lib/C_DEFAULT/EbComputeMean_C.h b/Source/Lib/C_DEFAULT/EbComputeMean_C.h index 051d2c8d6..f74fc595f 100644 --- a/Source/Lib/C_DEFAULT/EbComputeMean_C.h +++ b/Source/Lib/C_DEFAULT/EbComputeMean_C.h @@ -27,4 +27,4 @@ EB_U64 ComputeMeanOfSquaredValues( } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/C_DEFAULT/EbComputeSAD_C.c b/Source/Lib/C_DEFAULT/EbComputeSAD_C.c index a7b548dfe..c261e7ad0 100644 --- a/Source/Lib/C_DEFAULT/EbComputeSAD_C.c +++ b/Source/Lib/C_DEFAULT/EbComputeSAD_C.c @@ -163,56 +163,56 @@ EB_U32 FastLoop_NxMSadKernel( } void SadLoopKernel( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width, // input parameter, block width (N) - EB_U64 *bestSad, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter, - EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) - EB_S16 searchAreaWidth, - EB_S16 searchAreaHeight) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width, // input parameter, block width (N) + EB_U64 *bestSad, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter, + EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) + EB_S16 searchAreaWidth, + EB_S16 searchAreaHeight) { - EB_S16 xSearchIndex; - EB_S16 ySearchIndex; - - *bestSad = 0xffffff; - - for (ySearchIndex = 0; ySearchIndex < searchAreaHeight; ySearchIndex++) - { - for (xSearchIndex = 0; xSearchIndex < searchAreaWidth; xSearchIndex++) - { - EB_U32 x, y; - EB_U32 sad = 0; - - for (y = 0; y < height; y++) - { - for (x = 0; x < width; x++) - { - sad += EB_ABS_DIFF(src[y*srcStride + x], ref[xSearchIndex + y*refStride + x]); - } - - } - - // Update results - if (sad < *bestSad) - { - *bestSad = sad; - *xSearchCenter = xSearchIndex; - *ySearchCenter = ySearchIndex; - } - } - - ref += srcStrideRaw; - } - - return; + EB_S16 xSearchIndex; + EB_S16 ySearchIndex; + + *bestSad = 0xffffff; + + for (ySearchIndex = 0; ySearchIndex < searchAreaHeight; ySearchIndex++) + { + for (xSearchIndex = 0; xSearchIndex < searchAreaWidth; xSearchIndex++) + { + EB_U32 x, y; + EB_U32 sad = 0; + + for (y = 0; y < height; y++) + { + for (x = 0; x < width; x++) + { + sad += EB_ABS_DIFF(src[y*srcStride + x], ref[xSearchIndex + y*refStride + x]); + } + + } + + // Update results + if (sad < *bestSad) + { + *bestSad = sad; + *xSearchCenter = xSearchIndex; + *ySearchCenter = ySearchIndex; + } + } + + ref += srcStrideRaw; + } + + return; } -//compute a 8x4 SAD +//compute a 8x4 SAD static EB_U32 Subsad8x8( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride @@ -296,7 +296,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( for (xSearchIndex = 0; xSearchIndex < 8; xSearchIndex++) { - //8x8_0 + //8x8_0 sad8x8_0 = Subsad8x8(src, srcStride, ref + xSearchIndex, refStride); if (2 * sad8x8_0 < pBestSad8x8[0]) { pBestSad8x8[0] = 2 * sad8x8_0; @@ -305,7 +305,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( pBestMV8x8[0] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); } - //8x8_1 + //8x8_1 sad8x8_1 = Subsad8x8(src + 8, srcStride, ref + xSearchIndex + 8, refStride); if (2 * sad8x8_1 < pBestSad8x8[1]) { pBestSad8x8[1] = 2 * sad8x8_1; @@ -314,7 +314,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( pBestMV8x8[1] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); } - //8x8_2 + //8x8_2 sad8x8_2 = Subsad8x8(src + 8 * srcStride, srcStride, ref + xSearchIndex + 8 * refStride, refStride); if (2 * sad8x8_2 < pBestSad8x8[2]) { pBestSad8x8[2] = 2 * sad8x8_2; @@ -323,7 +323,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( pBestMV8x8[2] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); } - //8x8_3 + //8x8_3 sad8x8_3 = Subsad8x8(src + 8 + 8 * srcStride, srcStride, ref + 8 + 8 * refStride + xSearchIndex, refStride); if (2 * sad8x8_3 < pBestSad8x8[3]) { pBestSad8x8[3] = 2 * sad8x8_3; @@ -346,7 +346,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( } } - + /******************************************* Calcualte SAD for 32x32,64x64 from 16x16 and check if there is improvement, if yes keep diff --git a/Source/Lib/C_DEFAULT/EbComputeSAD_C.h b/Source/Lib/C_DEFAULT/EbComputeSAD_C.h index 56f92f807..ef670c401 100644 --- a/Source/Lib/C_DEFAULT/EbComputeSAD_C.h +++ b/Source/Lib/C_DEFAULT/EbComputeSAD_C.h @@ -10,14 +10,14 @@ #ifdef __cplusplus extern "C" { #endif - + EB_U32 FastLoop_NxMSadKernel( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) EB_U32 CombinedAveragingSAD( EB_U8 *src, @@ -32,22 +32,22 @@ EB_U32 CombinedAveragingSAD( EB_U32 Compute8x4SAD_Kernel( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr + EB_U8 *ref, // input parameter, reference samples Ptr EB_U32 refStride); // input parameter, reference stride void SadLoopKernel( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width, // input parameter, block width (N) - EB_U64 *bestSad, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter, - EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) - EB_S16 searchAreaWidth, - EB_S16 searchAreaHeight); + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width, // input parameter, block width (N) + EB_U64 *bestSad, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter, + EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) + EB_S16 searchAreaWidth, + EB_S16 searchAreaHeight); void SadLoopKernelSparse( @@ -86,5 +86,5 @@ void GetEightHorizontalSearchPointResults_32x32_64x64( #ifdef __cplusplus } -#endif -#endif // EbComputeSAD_C_h \ No newline at end of file +#endif +#endif // EbComputeSAD_C_h diff --git a/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h b/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h index 62d2ce869..3b62d227f 100644 --- a/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h +++ b/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h @@ -38,8 +38,8 @@ void Chroma2SampleEdgeDLFCore( EB_U8 crTc); void Chroma2SampleEdgeDLFCore16bit( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, @@ -49,4 +49,4 @@ void Chroma2SampleEdgeDLFCore16bit( #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c index 7d761d355..9a24cb50e 100644 --- a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c +++ b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c @@ -184,7 +184,7 @@ void IntraModeHorizontalLuma( EB_U32 topLeftOffset = size << 1; EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -232,7 +232,7 @@ void IntraModeHorizontalLuma16bit( EB_U32 topLeftOffset = size << 1; EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -351,7 +351,7 @@ void IntraModeDCLuma( EB_U8 predictionDcValue = 128; // needs to be changed to a macro based on bit depth EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -422,7 +422,7 @@ void IntraModeDCLuma16bit( EB_U16 predictionDcValue = 128; // needs to be changed to a macro based on bit depth EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -1049,4 +1049,4 @@ void IntraModeAngular16bit_Horizontal_Kernel( } predictionPtr++; } -} \ No newline at end of file +} diff --git a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h index 4092960c9..7a276f545 100644 --- a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h +++ b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h @@ -16,7 +16,7 @@ void IntraModeVerticalLuma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeVerticalLuma16bit( @@ -31,7 +31,7 @@ void IntraModeVerticalChroma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeVerticalChroma16bit( @@ -46,7 +46,7 @@ void IntraModeHorizontalLuma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeHorizontalLuma16bit( @@ -61,7 +61,7 @@ void IntraModeHorizontalChroma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeHorizontalChroma16bit( @@ -76,7 +76,7 @@ void IntraModeDCLuma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeDCLuma16bit( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -90,7 +90,7 @@ void IntraModeDCChroma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeDCChroma16bit( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -104,7 +104,7 @@ void IntraModePlanar( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModePlanar16bit( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -118,7 +118,7 @@ void IntraModeAngular_34( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeAngular16bit_34( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -132,7 +132,7 @@ void IntraModeAngular_18( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeAngular16bit_18( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -146,7 +146,7 @@ void IntraModeAngular_2( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeAngular16bit_2( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -167,9 +167,9 @@ void IntraModeAngular16bit_Vertical_Kernel( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); void IntraModeAngular_Horizontal_Kernel( EB_U32 size, @@ -190,5 +190,5 @@ void IntraModeAngular16bit_Horizontal_Kernel( #ifdef __cplusplus } -#endif -#endif // EbCompute8x8SAD_asm_h \ No newline at end of file +#endif +#endif // EbCompute8x8SAD_asm_h diff --git a/Source/Lib/C_DEFAULT/EbMcp_C.c b/Source/Lib/C_DEFAULT/EbMcp_C.c index f63d35baa..dfc96cd5d 100644 --- a/Source/Lib/C_DEFAULT/EbMcp_C.c +++ b/Source/Lib/C_DEFAULT/EbMcp_C.c @@ -2113,7 +2113,7 @@ void WpBiPredClipping16bit( } } -// Weighted Prediction - EncoderBitDepth : 8 +// Weighted Prediction - EncoderBitDepth : 8 void WpLumaInterpolationCopy( EB_BYTE refPic, EB_U32 srcStride, diff --git a/Source/Lib/C_DEFAULT/EbMcp_C.h b/Source/Lib/C_DEFAULT/EbMcp_C.h index 75cfdee4b..f53c57ed1 100644 --- a/Source/Lib/C_DEFAULT/EbMcp_C.h +++ b/Source/Lib/C_DEFAULT/EbMcp_C.h @@ -151,8 +151,8 @@ void WpBiPredClipping16bit(EB_U32 puWidth, EB_U32 puHeight, EB_S16 *list0Src, EB void uniPredCopy16bit( EB_U16* refPic, - EB_U32 srcStride, - EB_U16* dst, + EB_U32 srcStride, + EB_U16* dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, @@ -162,5 +162,5 @@ void uniPredCopy16bit( #ifdef __cplusplus } -#endif -#endif // EbMcp_C_h \ No newline at end of file +#endif +#endif // EbMcp_C_h diff --git a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c index 97906df41..0deb81007 100644 --- a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c +++ b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c @@ -113,10 +113,10 @@ void SadCalculation_32x32_64x64( } void InitializeBuffer_32bits( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value) { + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value) { EB_U32 cuIndex; diff --git a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h index a6394ec01..0d2f34ffd 100644 --- a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h +++ b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h @@ -32,10 +32,10 @@ extern void SadCalculation_32x32_64x64( EB_U32 mv); extern void InitializeBuffer_32bits( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value); + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value); void WeightSearchRegion( EB_U8 *inputBuffer, @@ -50,5 +50,5 @@ void WeightSearchRegion( #ifdef __cplusplus } -#endif -#endif // EbMeSadCalculation_C_h \ No newline at end of file +#endif +#endif // EbMeSadCalculation_C_h diff --git a/Source/Lib/C_DEFAULT/EbPackUnPack_C.c b/Source/Lib/C_DEFAULT/EbPackUnPack_C.c index 673bbf123..997af089d 100644 --- a/Source/Lib/C_DEFAULT/EbPackUnPack_C.c +++ b/Source/Lib/C_DEFAULT/EbPackUnPack_C.c @@ -42,47 +42,47 @@ void EB_ENC_msbPack2D( 2bit data storage : 4 2bit-pixels in one byte ************************************************/ void CompressedPackmsb( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height) + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height) { - EB_U64 row, kIdx; - EB_U16 outPixel; - EB_U8 nBitPixel; - EB_U8 four2bitPels; + EB_U64 row, kIdx; + EB_U16 outPixel; + EB_U8 nBitPixel; + EB_U8 four2bitPels; - for (row = 0; row> 6) & 3; + nBitPixel = (four2bitPels >> 6) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 0 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 0 + row*outStride] = outPixel | nBitPixel; + outPixel = in8BitBuffer[kIdx * 4 + 0 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 0 + row*outStride] = outPixel | nBitPixel; - nBitPixel = (four2bitPels >> 4) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 1 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 1 + row*outStride] = outPixel | nBitPixel; + nBitPixel = (four2bitPels >> 4) & 3; + outPixel = in8BitBuffer[kIdx * 4 + 1 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 1 + row*outStride] = outPixel | nBitPixel; - nBitPixel = (four2bitPels >> 2) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 2 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 2 + row*outStride] = outPixel | nBitPixel; + nBitPixel = (four2bitPels >> 2) & 3; + outPixel = in8BitBuffer[kIdx * 4 + 2 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 2 + row*outStride] = outPixel | nBitPixel; - nBitPixel = (four2bitPels >> 0) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 3 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 3 + row*outStride] = outPixel | nBitPixel; + nBitPixel = (four2bitPels >> 0) & 3; + outPixel = in8BitBuffer[kIdx * 4 + 3 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 3 + row*outStride] = outPixel | nBitPixel; - } - } + } + } } /************************************************ @@ -90,33 +90,33 @@ void CompressedPackmsb( 2bit data storage : 4 2bit-pixels in one byte ************************************************/ void CPack_C( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height) + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height) { - EB_U32 rowIndex, colIndex; - (void)localCache; - - for (rowIndex = 0; rowIndex < height; rowIndex++) - { - for (colIndex = 0; colIndex < width; colIndex += 4) - { - EB_U32 i = colIndex + rowIndex*innStride; - - EB_U8 compressedUnpackedPixel = 0; - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 0] >> 0) & 0xC0);//1100.0000 - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 1] >> 2) & 0x30);//0011.0000 - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 2] >> 4) & 0x0C);//0000.1100 - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 3] >> 6) & 0x03);//0000.0011 - - EB_U32 j = colIndex / 4 + rowIndex*outStride; - inCompnBitBuffer[j] = compressedUnpackedPixel; - } - } + EB_U32 rowIndex, colIndex; + (void)localCache; + + for (rowIndex = 0; rowIndex < height; rowIndex++) + { + for (colIndex = 0; colIndex < width; colIndex += 4) + { + EB_U32 i = colIndex + rowIndex*innStride; + + EB_U8 compressedUnpackedPixel = 0; + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 0] >> 0) & 0xC0);//1100.0000 + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 1] >> 2) & 0x30);//0011.0000 + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 2] >> 4) & 0x0C);//0000.1100 + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 3] >> 6) & 0x03);//0000.0011 + + EB_U32 j = colIndex / 4 + rowIndex*outStride; + inCompnBitBuffer[j] = compressedUnpackedPixel; + } + } } @@ -152,8 +152,8 @@ void EB_ENC_msbUnPack2D( void UnPack8BitData( EB_U16 *in16BitBuffer, EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, EB_U32 width, EB_U32 height) { @@ -178,11 +178,11 @@ void UnpackAvg( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height ) { - + EB_U64 j, k; EB_U8 inPixelL0, inPixelL1; @@ -193,18 +193,18 @@ void UnpackAvg( inPixelL0 = (EB_U8)(ref16L0[k + j*refL0Stride]>>2); inPixelL1 = (EB_U8)(ref16L1[k + j*refL1Stride]>>2); dstPtr[k + j*dstStride] = (inPixelL0 + inPixelL1 + 1)>>1; - + } } - + } void UnPack8BitDataSafeSub( EB_U16 *in16BitBuffer, EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, EB_U32 width, EB_U32 height ) @@ -230,11 +230,11 @@ void UnpackAvgSafeSub( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height ) { - + EB_U64 j, k; EB_U8 inPixelL0, inPixelL1; @@ -245,7 +245,7 @@ void UnpackAvgSafeSub( inPixelL0 = (EB_U8)(ref16L0[k + j*refL0Stride]>>2); inPixelL1 = (EB_U8)(ref16L1[k + j*refL1Stride]>>2); dstPtr[k + j*dstStride] = (inPixelL0 + inPixelL1 + 1)>>1; - + } - } + } } diff --git a/Source/Lib/C_DEFAULT/EbPackUnPack_C.h b/Source/Lib/C_DEFAULT/EbPackUnPack_C.h index 1f02b21df..4e041b788 100644 --- a/Source/Lib/C_DEFAULT/EbPackUnPack_C.h +++ b/Source/Lib/C_DEFAULT/EbPackUnPack_C.h @@ -25,22 +25,22 @@ void EB_ENC_msbPack2D( EB_U32 height); void CompressedPackmsb( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height); void CPack_C( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); @@ -56,8 +56,8 @@ void EB_ENC_msbUnPack2D( void UnPack8BitData( EB_U16 *in16BitBuffer, EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, EB_U32 width, EB_U32 height); void UnpackAvg( diff --git a/Source/Lib/C_DEFAULT/EbPictureOperators_C.c b/Source/Lib/C_DEFAULT/EbPictureOperators_C.c index 7f8b3d30e..466cd8431 100644 --- a/Source/Lib/C_DEFAULT/EbPictureOperators_C.c +++ b/Source/Lib/C_DEFAULT/EbPictureOperators_C.c @@ -666,4 +666,4 @@ EB_U64 SpatialFullDistortionKernel( ++rowIndex; } return spatialDistortion; -} \ No newline at end of file +} diff --git a/Source/Lib/C_DEFAULT/EbPictureOperators_C.h b/Source/Lib/C_DEFAULT/EbPictureOperators_C.h index 02eba76c8..b2a446dd6 100644 --- a/Source/Lib/C_DEFAULT/EbPictureOperators_C.h +++ b/Source/Lib/C_DEFAULT/EbPictureOperators_C.h @@ -10,7 +10,7 @@ #ifdef __cplusplus extern "C" { #endif - + void PictureAverageKernel( EB_BYTE src0, EB_U32 src0Stride, @@ -155,5 +155,5 @@ EB_U64 Compute8x8Satd_U8( #ifdef __cplusplus } -#endif -#endif // EbPictureOperators_C_h \ No newline at end of file +#endif +#endif // EbPictureOperators_C_h diff --git a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c index 6bf9b4ddb..7f4c1c4a8 100644 --- a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c +++ b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c @@ -21,107 +21,107 @@ static int clipToSigned8Bit(int x) * collects Sao Statistics ********************************************/ EB_ERRORTYPE GatherSaoStatisticsLcu_62x62_16bit( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_S32 diff; - EB_U32 boIndex, eoType, eoIndex; - EB_S16 signLeft, signRight, signTop, signBottom, signTopLeft, signBottomRight, signTopRight, signBottomLeft; + EB_S32 diff; + EB_U32 boIndex, eoType, eoIndex; + EB_S16 signLeft, signRight, signTop, signBottom, signTopLeft, signBottomRight, signTopRight, signBottomLeft; - EB_U16 *temporalInputSamplePtr; - EB_U16 *temporalReconSamplePtr; + EB_U16 *temporalInputSamplePtr; + EB_U16 *temporalReconSamplePtr; - EB_U32 i = 0; - EB_U32 j = 0; + EB_U32 i = 0; + EB_U32 j = 0; - EB_U32 boShift = 5; + EB_U32 boShift = 5; - // Intialize SAO Arrays + // Intialize SAO Arrays - // BO - for (boIndex = 0; boIndex < SAO_BO_INTERVALS; ++boIndex) { + // BO + for (boIndex = 0; boIndex < SAO_BO_INTERVALS; ++boIndex) { - boDiff[boIndex] = 0; - boCount[boIndex] = 0; - } + boDiff[boIndex] = 0; + boCount[boIndex] = 0; + } - // EO - for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { - for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES + 1; ++eoIndex) { + // EO + for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { + for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES + 1; ++eoIndex) { - eoDiff[eoType][eoIndex] = 0; - eoCount[eoType][eoIndex] = 0; + eoDiff[eoType][eoIndex] = 0; + eoCount[eoType][eoIndex] = 0; - } - } + } + } - temporalInputSamplePtr = inputSamplePtr + 1 + inputStride; - temporalReconSamplePtr = reconSamplePtr + 1 + reconStride; + temporalInputSamplePtr = inputSamplePtr + 1 + inputStride; + temporalReconSamplePtr = reconSamplePtr + 1 + reconStride; - for (j = 0; j < lcuHeight - 2; j++) { - for (i = 0; i < lcuWidth - 2; i++) { + for (j = 0; j < lcuHeight - 2; j++) { + for (i = 0; i < lcuWidth - 2; i++) { - diff = temporalInputSamplePtr[i] - temporalReconSamplePtr[i]; + diff = temporalInputSamplePtr[i] - temporalReconSamplePtr[i]; - //BO - boIndex = temporalReconSamplePtr[i] >> boShift; - boDiff[boIndex] += diff; - boCount[boIndex] ++; + //BO + boIndex = temporalReconSamplePtr[i] >> boShift; + boDiff[boIndex] += diff; + boCount[boIndex] ++; - //EO-0 - signLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - 1)]); - signRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + 1]); - eoIndex = signRight + signLeft + 2; - eoDiff[0][eoIndex] += diff; - eoCount[0][eoIndex] ++; + //EO-0 + signLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - 1)]); + signRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + 1]); + eoIndex = signRight + signLeft + 2; + eoDiff[0][eoIndex] += diff; + eoCount[0][eoIndex] ++; - //EO-90 - signTop = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride)]); - signBottom = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride]); - eoIndex = signTop + signBottom + 2; - eoDiff[1][eoIndex] += diff; - eoCount[1][eoIndex] ++; + //EO-90 + signTop = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride)]); + signBottom = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride]); + eoIndex = signTop + signBottom + 2; + eoDiff[1][eoIndex] += diff; + eoCount[1][eoIndex] ++; - //EO-45 - signTopRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride + 1)]); - signBottomLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride - 1]); - eoIndex = signTopRight + signBottomLeft + 2; - eoDiff[3][eoIndex] += diff; - eoCount[3][eoIndex] ++; + //EO-45 + signTopRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride + 1)]); + signBottomLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride - 1]); + eoIndex = signTopRight + signBottomLeft + 2; + eoDiff[3][eoIndex] += diff; + eoCount[3][eoIndex] ++; - //EO-135 - signTopLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride - 1)]); - signBottomRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride + 1]); - eoIndex = signTopLeft + signBottomRight + 2; - eoDiff[2][eoIndex] += diff; - eoCount[2][eoIndex] ++; - } + //EO-135 + signTopLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride - 1)]); + signBottomRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride + 1]); + eoIndex = signTopLeft + signBottomRight + 2; + eoDiff[2][eoIndex] += diff; + eoCount[2][eoIndex] ++; + } - temporalInputSamplePtr += inputStride; - temporalReconSamplePtr += reconStride; + temporalInputSamplePtr += inputStride; + temporalReconSamplePtr += reconStride; - } - for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { - eoDiff[eoType][2] = eoDiff[eoType][3]; - eoDiff[eoType][3] = eoDiff[eoType][4]; - eoCount[eoType][2] = eoCount[eoType][3]; - eoCount[eoType][3] = eoCount[eoType][4]; - } + } + for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { + eoDiff[eoType][2] = eoDiff[eoType][3]; + eoDiff[eoType][3] = eoDiff[eoType][4]; + eoCount[eoType][2] = eoCount[eoType][3]; + eoCount[eoType][3] = eoCount[eoType][4]; + } - return return_error; + return return_error; } - + EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr EB_U32 inputStride, // input parameter, source stride @@ -130,7 +130,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( EB_U32 lcuWidth, // input parameter, LCU width EB_U32 lcuHeight, // input parameter, LCU height EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { @@ -223,7 +223,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( return return_error; } - + EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_Lossy( EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr EB_U32 inputStride, // input parameter, source stride @@ -332,7 +332,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit( EB_U32 i = 0; EB_U32 j = 0; - // Intialize SAO Arrays + // Intialize SAO Arrays // EO for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES + 1; ++eoIndex) { diff --git a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h index 657b2d758..95b8b74e0 100644 --- a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h +++ b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h @@ -12,7 +12,7 @@ extern "C" { #endif - + EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( EB_U8 *inputSamplePtr, EB_U32 inputStride, @@ -40,16 +40,16 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_BT_SSE2( EB_ERRORTYPE GatherSaoStatisticsLcu_62x62_16bit( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] @@ -170,4 +170,4 @@ EB_ERRORTYPE SAOApplyEO_0_16bit( #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/C_DEFAULT/EbTransforms_C.c b/Source/Lib/C_DEFAULT/EbTransforms_C.c index 4e3d4f945..b9657ed8a 100644 --- a/Source/Lib/C_DEFAULT/EbTransforms_C.c +++ b/Source/Lib/C_DEFAULT/EbTransforms_C.c @@ -133,24 +133,24 @@ void QuantizeInvQuantize( } #define EB_INTRA_CHROMA_DM 4 -#define MAX_TU_SIZE 32 +#define MAX_TU_SIZE 32 //enum COMPONENT_TYPE //{ -// COMPONENT_LUMA = 0, // luma -// COMPONENT_CHROMA = 1, // chroma (Cb+Cr) -// COMPONENT_CHROMA_CB = 2, // chroma Cb -// COMPONENT_CHROMA_CR = 3, // chroma Cr -// COMPONENT_ALL = 4, // Y+Cb+Cr -// COMPONENT_NONE = 15 +// COMPONENT_LUMA = 0, // luma +// COMPONENT_CHROMA = 1, // chroma (Cb+Cr) +// COMPONENT_CHROMA_CB = 2, // chroma Cb +// COMPONENT_CHROMA_CR = 3, // chroma Cr +// COMPONENT_ALL = 4, // Y+Cb+Cr +// COMPONENT_NONE = 15 //}; // // //enum COEFF_SCAN_TYPE2 //{ -// SCAN_DIAG2 = 0, // diagonal scan -// SCAN_HOR2, // first scan is horizontal -// SCAN_VER2 // first scan is vertical +// SCAN_DIAG2 = 0, // diagonal scan +// SCAN_HOR2, // first scan is horizontal +// SCAN_VER2 // first scan is vertical //}; /************************************** @@ -158,46 +158,46 @@ void QuantizeInvQuantize( **************************************/ void UpdateQiQCoef_R( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag) + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag) { - EB_U32 coeffLocation = 0; + EB_U32 coeffLocation = 0; - //EB_U32 rowIndex = 0; - //EB_U32 colIndex = 0; + //EB_U32 rowIndex = 0; + //EB_U32 colIndex = 0; if ((*nonzerocoeff < 10) && enableContouringQCUpdateFlag && sliceType == EB_I_PICTURE && temporalLayer == 0 && componentType == 0){ - coeffLocation = (areaSize - 1) + (areaSize - 1) * coeffStride; - - if (quantCoeff[coeffLocation] == 0){ - (*nonzerocoeff)++; - quantCoeff[coeffLocation] = 1; - reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - } - } - - if ((*nonzerocoeff == 0) && (enableCbflag == 1)) - { - EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); - *nonzerocoeff = 1; - quantCoeff[coeffLocation] = 1; - reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - } + coeffLocation = (areaSize - 1) + (areaSize - 1) * coeffStride; + + if (quantCoeff[coeffLocation] == 0){ + (*nonzerocoeff)++; + quantCoeff[coeffLocation] = 1; + reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + } + } + + if ((*nonzerocoeff == 0) && (enableCbflag == 1)) + { + EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); + *nonzerocoeff = 1; + quantCoeff[coeffLocation] = 1; + reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + } } /********************************************************************* @@ -207,25 +207,25 @@ void UpdateQiQCoef_R( *********************************************************************/ void UpdateQiQCoef( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag) + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag) { - EB_U32 coeffLocation = 0; - //EB_U32 rowIndex = 0; - //EB_U32 colIndex = 0; + EB_U32 coeffLocation = 0; + //EB_U32 rowIndex = 0; + //EB_U32 colIndex = 0; @@ -240,14 +240,14 @@ void UpdateQiQCoef( } } - - if ((*nonzerocoeff == 0) && (enableCbflag == 1)) - { - EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); - *nonzerocoeff = 1; - quantCoeff[coeffLocation] = 1; - reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - } + + if ((*nonzerocoeff == 0) && (enableCbflag == 1)) + { + EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); + *nonzerocoeff = 1; + quantCoeff[coeffLocation] = 1; + reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + } } /********************************************************************* @@ -490,226 +490,226 @@ inline static void PartialButterfly32( } inline static void PartialButterfly32Estimate( - EB_S16 *residual, - EB_S16 *transformCoefficients, - const EB_U32 srcStride, - const EB_U32 dstStride, - const EB_U32 shift) + EB_S16 *residual, + EB_S16 *transformCoefficients, + const EB_U32 srcStride, + const EB_U32 dstStride, + const EB_U32 shift) { - EB_S16 even0, even1, even2, even3, even4, even5, even6, even7, even8, even9, even10, even11, even12, even13, even14, even15; - EB_S16 odd0, odd1, odd2, odd3, odd4, odd5, odd6, odd7, odd8, odd9, odd10, odd11, odd12, odd13, odd14, odd15; - EB_S16 evenEven0, evenEven1, evenEven2, evenEven3, evenEven4, evenEven5, evenEven6, evenEven7; - EB_S16 evenOdd0, evenOdd1, evenOdd2, evenOdd3, evenOdd4, evenOdd5, evenOdd6, evenOdd7; - EB_S32 evenEvenEven0, evenEvenEven1, evenEvenEven2, evenEvenEven3; - EB_S32 evenEvenOdd0, evenEvenOdd1, evenEvenOdd2, evenEvenOdd3; - EB_S32 evenEvenEvenEven0, evenEvenEvenEven1; - EB_S32 evenEvenEvenOdd0, evenEvenEvenOdd1; - EB_U32 rowIndex, rowStrideIndex; - const EB_S16 offset = 1 << (shift - 1); - - for (rowIndex = 0; rowIndex < 32; rowIndex++) { - rowStrideIndex = rowIndex*srcStride; - - //Calculating even and odd variables - even0 = residual[rowStrideIndex + 0] + residual[rowStrideIndex + 31]; - even1 = residual[rowStrideIndex + 1] + residual[rowStrideIndex + 30]; - even2 = residual[rowStrideIndex + 2] + residual[rowStrideIndex + 29]; - even3 = residual[rowStrideIndex + 3] + residual[rowStrideIndex + 28]; - even4 = residual[rowStrideIndex + 4] + residual[rowStrideIndex + 27]; - even5 = residual[rowStrideIndex + 5] + residual[rowStrideIndex + 26]; - even6 = residual[rowStrideIndex + 6] + residual[rowStrideIndex + 25]; - even7 = residual[rowStrideIndex + 7] + residual[rowStrideIndex + 24]; - even8 = residual[rowStrideIndex + 8] + residual[rowStrideIndex + 23]; - even9 = residual[rowStrideIndex + 9] + residual[rowStrideIndex + 22]; - even10 = residual[rowStrideIndex + 10] + residual[rowStrideIndex + 21]; - even11 = residual[rowStrideIndex + 11] + residual[rowStrideIndex + 20]; - even12 = residual[rowStrideIndex + 12] + residual[rowStrideIndex + 19]; - even13 = residual[rowStrideIndex + 13] + residual[rowStrideIndex + 18]; - even14 = residual[rowStrideIndex + 14] + residual[rowStrideIndex + 17]; - even15 = residual[rowStrideIndex + 15] + residual[rowStrideIndex + 16]; - - odd0 = residual[rowStrideIndex + 0] - residual[rowStrideIndex + 31]; - odd1 = residual[rowStrideIndex + 1] - residual[rowStrideIndex + 30]; - odd2 = residual[rowStrideIndex + 2] - residual[rowStrideIndex + 29]; - odd3 = residual[rowStrideIndex + 3] - residual[rowStrideIndex + 28]; - odd4 = residual[rowStrideIndex + 4] - residual[rowStrideIndex + 27]; - odd5 = residual[rowStrideIndex + 5] - residual[rowStrideIndex + 26]; - odd6 = residual[rowStrideIndex + 6] - residual[rowStrideIndex + 25]; - odd7 = residual[rowStrideIndex + 7] - residual[rowStrideIndex + 24]; - odd8 = residual[rowStrideIndex + 8] - residual[rowStrideIndex + 23]; - odd9 = residual[rowStrideIndex + 9] - residual[rowStrideIndex + 22]; - odd10 = residual[rowStrideIndex + 10] - residual[rowStrideIndex + 21]; - odd11 = residual[rowStrideIndex + 11] - residual[rowStrideIndex + 20]; - odd12 = residual[rowStrideIndex + 12] - residual[rowStrideIndex + 19]; - odd13 = residual[rowStrideIndex + 13] - residual[rowStrideIndex + 18]; - odd14 = residual[rowStrideIndex + 14] - residual[rowStrideIndex + 17]; - odd15 = residual[rowStrideIndex + 15] - residual[rowStrideIndex + 16]; - - //Calculating evenEven and evenOdd variables - evenEven0 = even0 + even15; - evenEven1 = even1 + even14; - evenEven2 = even2 + even13; - evenEven3 = even3 + even12; - evenEven4 = even4 + even11; - evenEven5 = even5 + even10; - evenEven6 = even6 + even9; - evenEven7 = even7 + even8; - - evenOdd0 = even0 - even15; - evenOdd1 = even1 - even14; - evenOdd2 = even2 - even13; - evenOdd3 = even3 - even12; - evenOdd4 = even4 - even11; - evenOdd5 = even5 - even10; - evenOdd6 = even6 - even9; - evenOdd7 = even7 - even8; - - //Calculating evenEvenEven and evenEvenOdd variables - evenEvenEven0 = evenEven0 + evenEven7; - evenEvenEven1 = evenEven1 + evenEven6; - evenEvenEven2 = evenEven2 + evenEven5; - evenEvenEven3 = evenEven3 + evenEven4; - - evenEvenOdd0 = evenEven0 - evenEven7; - evenEvenOdd1 = evenEven1 - evenEven6; - evenEvenOdd2 = evenEven2 - evenEven5; - evenEvenOdd3 = evenEven3 - evenEven4; - - //Calculating evenEvenEvenEven and evenEvenEvenOdd variables - evenEvenEvenEven0 = evenEvenEven0 + evenEvenEven3; - evenEvenEvenEven1 = evenEvenEven1 + evenEvenEven2; - - evenEvenEvenOdd0 = evenEvenEven0 - evenEvenEven3; - evenEvenEvenOdd1 = evenEvenEven1 - evenEvenEven2; - - transformCoefficients[0 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[0 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[0 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); - transformCoefficients[8 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[8 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[8 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); - transformCoefficients[16 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[16 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[16 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); - transformCoefficients[24 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[24 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[24 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); - - transformCoefficients[4 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[4 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[4 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[4 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[4 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - transformCoefficients[12 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[12 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[12 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[12 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[12 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - transformCoefficients[20 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[20 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[20 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[20 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[20 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - transformCoefficients[28 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[28 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[28 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[28 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[28 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - - transformCoefficients[2 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[2 * 32 + 0] * evenOdd0 + DctCoef32x32[2 * 32 + 1] * evenOdd1 + - DctCoef32x32[2 * 32 + 2] * evenOdd2 + DctCoef32x32[2 * 32 + 3] * evenOdd3 + - DctCoef32x32[2 * 32 + 4] * evenOdd4 + DctCoef32x32[2 * 32 + 5] * evenOdd5 + - DctCoef32x32[2 * 32 + 6] * evenOdd6 + DctCoef32x32[2 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[6 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[6 * 32 + 0] * evenOdd0 + DctCoef32x32[6 * 32 + 1] * evenOdd1 + - DctCoef32x32[6 * 32 + 2] * evenOdd2 + DctCoef32x32[6 * 32 + 3] * evenOdd3 + - DctCoef32x32[6 * 32 + 4] * evenOdd4 + DctCoef32x32[6 * 32 + 5] * evenOdd5 + - DctCoef32x32[6 * 32 + 6] * evenOdd6 + DctCoef32x32[6 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[10 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[10 * 32 + 0] * evenOdd0 + DctCoef32x32[10 * 32 + 1] * evenOdd1 + - DctCoef32x32[10 * 32 + 2] * evenOdd2 + DctCoef32x32[10 * 32 + 3] * evenOdd3 + - DctCoef32x32[10 * 32 + 4] * evenOdd4 + DctCoef32x32[10 * 32 + 5] * evenOdd5 + - DctCoef32x32[10 * 32 + 6] * evenOdd6 + DctCoef32x32[10 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[14 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[14 * 32 + 0] * evenOdd0 + DctCoef32x32[14 * 32 + 1] * evenOdd1 + - DctCoef32x32[14 * 32 + 2] * evenOdd2 + DctCoef32x32[14 * 32 + 3] * evenOdd3 + - DctCoef32x32[14 * 32 + 4] * evenOdd4 + DctCoef32x32[14 * 32 + 5] * evenOdd5 + - DctCoef32x32[14 * 32 + 6] * evenOdd6 + DctCoef32x32[14 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[18 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[18 * 32 + 0] * evenOdd0 + DctCoef32x32[18 * 32 + 1] * evenOdd1 + - DctCoef32x32[18 * 32 + 2] * evenOdd2 + DctCoef32x32[18 * 32 + 3] * evenOdd3 + - DctCoef32x32[18 * 32 + 4] * evenOdd4 + DctCoef32x32[18 * 32 + 5] * evenOdd5 + - DctCoef32x32[18 * 32 + 6] * evenOdd6 + DctCoef32x32[18 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[22 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[22 * 32 + 0] * evenOdd0 + DctCoef32x32[22 * 32 + 1] * evenOdd1 + - DctCoef32x32[22 * 32 + 2] * evenOdd2 + DctCoef32x32[22 * 32 + 3] * evenOdd3 + - DctCoef32x32[22 * 32 + 4] * evenOdd4 + DctCoef32x32[22 * 32 + 5] * evenOdd5 + - DctCoef32x32[22 * 32 + 6] * evenOdd6 + DctCoef32x32[22 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[26 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[26 * 32 + 0] * evenOdd0 + DctCoef32x32[26 * 32 + 1] * evenOdd1 + - DctCoef32x32[26 * 32 + 2] * evenOdd2 + DctCoef32x32[26 * 32 + 3] * evenOdd3 + - DctCoef32x32[26 * 32 + 4] * evenOdd4 + DctCoef32x32[26 * 32 + 5] * evenOdd5 + - DctCoef32x32[26 * 32 + 6] * evenOdd6 + DctCoef32x32[26 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[30 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[30 * 32 + 0] * evenOdd0 + DctCoef32x32[30 * 32 + 1] * evenOdd1 + - DctCoef32x32[30 * 32 + 2] * evenOdd2 + DctCoef32x32[30 * 32 + 3] * evenOdd3 + - DctCoef32x32[30 * 32 + 4] * evenOdd4 + DctCoef32x32[30 * 32 + 5] * evenOdd5 + - DctCoef32x32[30 * 32 + 6] * evenOdd6 + DctCoef32x32[30 * 32 + 7] * evenOdd7 + offset) >> shift); - - transformCoefficients[1 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[1 * 32 + 0] * odd0 + DctCoef32x32[1 * 32 + 1] * odd1 + DctCoef32x32[1 * 32 + 2] * odd2 + DctCoef32x32[1 * 32 + 3] * odd3 + - DctCoef32x32[1 * 32 + 4] * odd4 + DctCoef32x32[1 * 32 + 5] * odd5 + DctCoef32x32[1 * 32 + 6] * odd6 + DctCoef32x32[1 * 32 + 7] * odd7 + - DctCoef32x32[1 * 32 + 8] * odd8 + DctCoef32x32[1 * 32 + 9] * odd9 + DctCoef32x32[1 * 32 + 10] * odd10 + DctCoef32x32[1 * 32 + 11] * odd11 + - DctCoef32x32[1 * 32 + 12] * odd12 + DctCoef32x32[1 * 32 + 13] * odd13 + DctCoef32x32[1 * 32 + 14] * odd14 + DctCoef32x32[1 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[3 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[3 * 32 + 0] * odd0 + DctCoef32x32[3 * 32 + 1] * odd1 + DctCoef32x32[3 * 32 + 2] * odd2 + DctCoef32x32[3 * 32 + 3] * odd3 + - DctCoef32x32[3 * 32 + 4] * odd4 + DctCoef32x32[3 * 32 + 5] * odd5 + DctCoef32x32[3 * 32 + 6] * odd6 + DctCoef32x32[3 * 32 + 7] * odd7 + - DctCoef32x32[3 * 32 + 8] * odd8 + DctCoef32x32[3 * 32 + 9] * odd9 + DctCoef32x32[3 * 32 + 10] * odd10 + DctCoef32x32[3 * 32 + 11] * odd11 + - DctCoef32x32[3 * 32 + 12] * odd12 + DctCoef32x32[3 * 32 + 13] * odd13 + DctCoef32x32[3 * 32 + 14] * odd14 + DctCoef32x32[3 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[5 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[5 * 32 + 0] * odd0 + DctCoef32x32[5 * 32 + 1] * odd1 + DctCoef32x32[5 * 32 + 2] * odd2 + DctCoef32x32[5 * 32 + 3] * odd3 + - DctCoef32x32[5 * 32 + 4] * odd4 + DctCoef32x32[5 * 32 + 5] * odd5 + DctCoef32x32[5 * 32 + 6] * odd6 + DctCoef32x32[5 * 32 + 7] * odd7 + - DctCoef32x32[5 * 32 + 8] * odd8 + DctCoef32x32[5 * 32 + 9] * odd9 + DctCoef32x32[5 * 32 + 10] * odd10 + DctCoef32x32[5 * 32 + 11] * odd11 + - DctCoef32x32[5 * 32 + 12] * odd12 + DctCoef32x32[5 * 32 + 13] * odd13 + DctCoef32x32[5 * 32 + 14] * odd14 + DctCoef32x32[5 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[7 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[7 * 32 + 0] * odd0 + DctCoef32x32[7 * 32 + 1] * odd1 + DctCoef32x32[7 * 32 + 2] * odd2 + DctCoef32x32[7 * 32 + 3] * odd3 + - DctCoef32x32[7 * 32 + 4] * odd4 + DctCoef32x32[7 * 32 + 5] * odd5 + DctCoef32x32[7 * 32 + 6] * odd6 + DctCoef32x32[7 * 32 + 7] * odd7 + - DctCoef32x32[7 * 32 + 8] * odd8 + DctCoef32x32[7 * 32 + 9] * odd9 + DctCoef32x32[7 * 32 + 10] * odd10 + DctCoef32x32[7 * 32 + 11] * odd11 + - DctCoef32x32[7 * 32 + 12] * odd12 + DctCoef32x32[7 * 32 + 13] * odd13 + DctCoef32x32[7 * 32 + 14] * odd14 + DctCoef32x32[7 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[9 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[9 * 32 + 0] * odd0 + DctCoef32x32[9 * 32 + 1] * odd1 + DctCoef32x32[9 * 32 + 2] * odd2 + DctCoef32x32[9 * 32 + 3] * odd3 + - DctCoef32x32[9 * 32 + 4] * odd4 + DctCoef32x32[9 * 32 + 5] * odd5 + DctCoef32x32[9 * 32 + 6] * odd6 + DctCoef32x32[9 * 32 + 7] * odd7 + - DctCoef32x32[9 * 32 + 8] * odd8 + DctCoef32x32[9 * 32 + 9] * odd9 + DctCoef32x32[9 * 32 + 10] * odd10 + DctCoef32x32[9 * 32 + 11] * odd11 + - DctCoef32x32[9 * 32 + 12] * odd12 + DctCoef32x32[9 * 32 + 13] * odd13 + DctCoef32x32[9 * 32 + 14] * odd14 + DctCoef32x32[9 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[11 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[11 * 32 + 0] * odd0 + DctCoef32x32[11 * 32 + 1] * odd1 + DctCoef32x32[11 * 32 + 2] * odd2 + DctCoef32x32[11 * 32 + 3] * odd3 + - DctCoef32x32[11 * 32 + 4] * odd4 + DctCoef32x32[11 * 32 + 5] * odd5 + DctCoef32x32[11 * 32 + 6] * odd6 + DctCoef32x32[11 * 32 + 7] * odd7 + - DctCoef32x32[11 * 32 + 8] * odd8 + DctCoef32x32[11 * 32 + 9] * odd9 + DctCoef32x32[11 * 32 + 10] * odd10 + DctCoef32x32[11 * 32 + 11] * odd11 + - DctCoef32x32[11 * 32 + 12] * odd12 + DctCoef32x32[11 * 32 + 13] * odd13 + DctCoef32x32[11 * 32 + 14] * odd14 + DctCoef32x32[11 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[13 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[13 * 32 + 0] * odd0 + DctCoef32x32[13 * 32 + 1] * odd1 + DctCoef32x32[13 * 32 + 2] * odd2 + DctCoef32x32[13 * 32 + 3] * odd3 + - DctCoef32x32[13 * 32 + 4] * odd4 + DctCoef32x32[13 * 32 + 5] * odd5 + DctCoef32x32[13 * 32 + 6] * odd6 + DctCoef32x32[13 * 32 + 7] * odd7 + - DctCoef32x32[13 * 32 + 8] * odd8 + DctCoef32x32[13 * 32 + 9] * odd9 + DctCoef32x32[13 * 32 + 10] * odd10 + DctCoef32x32[13 * 32 + 11] * odd11 + - DctCoef32x32[13 * 32 + 12] * odd12 + DctCoef32x32[13 * 32 + 13] * odd13 + DctCoef32x32[13 * 32 + 14] * odd14 + DctCoef32x32[13 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[15 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[15 * 32 + 0] * odd0 + DctCoef32x32[15 * 32 + 1] * odd1 + DctCoef32x32[15 * 32 + 2] * odd2 + DctCoef32x32[15 * 32 + 3] * odd3 + - DctCoef32x32[15 * 32 + 4] * odd4 + DctCoef32x32[15 * 32 + 5] * odd5 + DctCoef32x32[15 * 32 + 6] * odd6 + DctCoef32x32[15 * 32 + 7] * odd7 + - DctCoef32x32[15 * 32 + 8] * odd8 + DctCoef32x32[15 * 32 + 9] * odd9 + DctCoef32x32[15 * 32 + 10] * odd10 + DctCoef32x32[15 * 32 + 11] * odd11 + - DctCoef32x32[15 * 32 + 12] * odd12 + DctCoef32x32[15 * 32 + 13] * odd13 + DctCoef32x32[15 * 32 + 14] * odd14 + DctCoef32x32[15 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[17 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[17 * 32 + 0] * odd0 + DctCoef32x32[17 * 32 + 1] * odd1 + DctCoef32x32[17 * 32 + 2] * odd2 + DctCoef32x32[17 * 32 + 3] * odd3 + - DctCoef32x32[17 * 32 + 4] * odd4 + DctCoef32x32[17 * 32 + 5] * odd5 + DctCoef32x32[17 * 32 + 6] * odd6 + DctCoef32x32[17 * 32 + 7] * odd7 + - DctCoef32x32[17 * 32 + 8] * odd8 + DctCoef32x32[17 * 32 + 9] * odd9 + DctCoef32x32[17 * 32 + 10] * odd10 + DctCoef32x32[17 * 32 + 11] * odd11 + - DctCoef32x32[17 * 32 + 12] * odd12 + DctCoef32x32[17 * 32 + 13] * odd13 + DctCoef32x32[17 * 32 + 14] * odd14 + DctCoef32x32[17 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[19 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[19 * 32 + 0] * odd0 + DctCoef32x32[19 * 32 + 1] * odd1 + DctCoef32x32[19 * 32 + 2] * odd2 + DctCoef32x32[19 * 32 + 3] * odd3 + - DctCoef32x32[19 * 32 + 4] * odd4 + DctCoef32x32[19 * 32 + 5] * odd5 + DctCoef32x32[19 * 32 + 6] * odd6 + DctCoef32x32[19 * 32 + 7] * odd7 + - DctCoef32x32[19 * 32 + 8] * odd8 + DctCoef32x32[19 * 32 + 9] * odd9 + DctCoef32x32[19 * 32 + 10] * odd10 + DctCoef32x32[19 * 32 + 11] * odd11 + - DctCoef32x32[19 * 32 + 12] * odd12 + DctCoef32x32[19 * 32 + 13] * odd13 + DctCoef32x32[19 * 32 + 14] * odd14 + DctCoef32x32[19 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[21 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[21 * 32 + 0] * odd0 + DctCoef32x32[21 * 32 + 1] * odd1 + DctCoef32x32[21 * 32 + 2] * odd2 + DctCoef32x32[21 * 32 + 3] * odd3 + - DctCoef32x32[21 * 32 + 4] * odd4 + DctCoef32x32[21 * 32 + 5] * odd5 + DctCoef32x32[21 * 32 + 6] * odd6 + DctCoef32x32[21 * 32 + 7] * odd7 + - DctCoef32x32[21 * 32 + 8] * odd8 + DctCoef32x32[21 * 32 + 9] * odd9 + DctCoef32x32[21 * 32 + 10] * odd10 + DctCoef32x32[21 * 32 + 11] * odd11 + - DctCoef32x32[21 * 32 + 12] * odd12 + DctCoef32x32[21 * 32 + 13] * odd13 + DctCoef32x32[21 * 32 + 14] * odd14 + DctCoef32x32[21 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[23 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[23 * 32 + 0] * odd0 + DctCoef32x32[23 * 32 + 1] * odd1 + DctCoef32x32[23 * 32 + 2] * odd2 + DctCoef32x32[23 * 32 + 3] * odd3 + - DctCoef32x32[23 * 32 + 4] * odd4 + DctCoef32x32[23 * 32 + 5] * odd5 + DctCoef32x32[23 * 32 + 6] * odd6 + DctCoef32x32[23 * 32 + 7] * odd7 + - DctCoef32x32[23 * 32 + 8] * odd8 + DctCoef32x32[23 * 32 + 9] * odd9 + DctCoef32x32[23 * 32 + 10] * odd10 + DctCoef32x32[23 * 32 + 11] * odd11 + - DctCoef32x32[23 * 32 + 12] * odd12 + DctCoef32x32[23 * 32 + 13] * odd13 + DctCoef32x32[23 * 32 + 14] * odd14 + DctCoef32x32[23 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[25 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[25 * 32 + 0] * odd0 + DctCoef32x32[25 * 32 + 1] * odd1 + DctCoef32x32[25 * 32 + 2] * odd2 + DctCoef32x32[25 * 32 + 3] * odd3 + - DctCoef32x32[25 * 32 + 4] * odd4 + DctCoef32x32[25 * 32 + 5] * odd5 + DctCoef32x32[25 * 32 + 6] * odd6 + DctCoef32x32[25 * 32 + 7] * odd7 + - DctCoef32x32[25 * 32 + 8] * odd8 + DctCoef32x32[25 * 32 + 9] * odd9 + DctCoef32x32[25 * 32 + 10] * odd10 + DctCoef32x32[25 * 32 + 11] * odd11 + - DctCoef32x32[25 * 32 + 12] * odd12 + DctCoef32x32[25 * 32 + 13] * odd13 + DctCoef32x32[25 * 32 + 14] * odd14 + DctCoef32x32[25 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[27 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[27 * 32 + 0] * odd0 + DctCoef32x32[27 * 32 + 1] * odd1 + DctCoef32x32[27 * 32 + 2] * odd2 + DctCoef32x32[27 * 32 + 3] * odd3 + - DctCoef32x32[27 * 32 + 4] * odd4 + DctCoef32x32[27 * 32 + 5] * odd5 + DctCoef32x32[27 * 32 + 6] * odd6 + DctCoef32x32[27 * 32 + 7] * odd7 + - DctCoef32x32[27 * 32 + 8] * odd8 + DctCoef32x32[27 * 32 + 9] * odd9 + DctCoef32x32[27 * 32 + 10] * odd10 + DctCoef32x32[27 * 32 + 11] * odd11 + - DctCoef32x32[27 * 32 + 12] * odd12 + DctCoef32x32[27 * 32 + 13] * odd13 + DctCoef32x32[27 * 32 + 14] * odd14 + DctCoef32x32[27 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[29 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[29 * 32 + 0] * odd0 + DctCoef32x32[29 * 32 + 1] * odd1 + DctCoef32x32[29 * 32 + 2] * odd2 + DctCoef32x32[29 * 32 + 3] * odd3 + - DctCoef32x32[29 * 32 + 4] * odd4 + DctCoef32x32[29 * 32 + 5] * odd5 + DctCoef32x32[29 * 32 + 6] * odd6 + DctCoef32x32[29 * 32 + 7] * odd7 + - DctCoef32x32[29 * 32 + 8] * odd8 + DctCoef32x32[29 * 32 + 9] * odd9 + DctCoef32x32[29 * 32 + 10] * odd10 + DctCoef32x32[29 * 32 + 11] * odd11 + - DctCoef32x32[29 * 32 + 12] * odd12 + DctCoef32x32[29 * 32 + 13] * odd13 + DctCoef32x32[29 * 32 + 14] * odd14 + DctCoef32x32[29 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[31 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[31 * 32 + 0] * odd0 + DctCoef32x32[31 * 32 + 1] * odd1 + DctCoef32x32[31 * 32 + 2] * odd2 + DctCoef32x32[31 * 32 + 3] * odd3 + - DctCoef32x32[31 * 32 + 4] * odd4 + DctCoef32x32[31 * 32 + 5] * odd5 + DctCoef32x32[31 * 32 + 6] * odd6 + DctCoef32x32[31 * 32 + 7] * odd7 + - DctCoef32x32[31 * 32 + 8] * odd8 + DctCoef32x32[31 * 32 + 9] * odd9 + DctCoef32x32[31 * 32 + 10] * odd10 + DctCoef32x32[31 * 32 + 11] * odd11 + - DctCoef32x32[31 * 32 + 12] * odd12 + DctCoef32x32[31 * 32 + 13] * odd13 + DctCoef32x32[31 * 32 + 14] * odd14 + DctCoef32x32[31 * 32 + 15] * odd15 + - offset) >> shift); - } + EB_S16 even0, even1, even2, even3, even4, even5, even6, even7, even8, even9, even10, even11, even12, even13, even14, even15; + EB_S16 odd0, odd1, odd2, odd3, odd4, odd5, odd6, odd7, odd8, odd9, odd10, odd11, odd12, odd13, odd14, odd15; + EB_S16 evenEven0, evenEven1, evenEven2, evenEven3, evenEven4, evenEven5, evenEven6, evenEven7; + EB_S16 evenOdd0, evenOdd1, evenOdd2, evenOdd3, evenOdd4, evenOdd5, evenOdd6, evenOdd7; + EB_S32 evenEvenEven0, evenEvenEven1, evenEvenEven2, evenEvenEven3; + EB_S32 evenEvenOdd0, evenEvenOdd1, evenEvenOdd2, evenEvenOdd3; + EB_S32 evenEvenEvenEven0, evenEvenEvenEven1; + EB_S32 evenEvenEvenOdd0, evenEvenEvenOdd1; + EB_U32 rowIndex, rowStrideIndex; + const EB_S16 offset = 1 << (shift - 1); + + for (rowIndex = 0; rowIndex < 32; rowIndex++) { + rowStrideIndex = rowIndex*srcStride; + + //Calculating even and odd variables + even0 = residual[rowStrideIndex + 0] + residual[rowStrideIndex + 31]; + even1 = residual[rowStrideIndex + 1] + residual[rowStrideIndex + 30]; + even2 = residual[rowStrideIndex + 2] + residual[rowStrideIndex + 29]; + even3 = residual[rowStrideIndex + 3] + residual[rowStrideIndex + 28]; + even4 = residual[rowStrideIndex + 4] + residual[rowStrideIndex + 27]; + even5 = residual[rowStrideIndex + 5] + residual[rowStrideIndex + 26]; + even6 = residual[rowStrideIndex + 6] + residual[rowStrideIndex + 25]; + even7 = residual[rowStrideIndex + 7] + residual[rowStrideIndex + 24]; + even8 = residual[rowStrideIndex + 8] + residual[rowStrideIndex + 23]; + even9 = residual[rowStrideIndex + 9] + residual[rowStrideIndex + 22]; + even10 = residual[rowStrideIndex + 10] + residual[rowStrideIndex + 21]; + even11 = residual[rowStrideIndex + 11] + residual[rowStrideIndex + 20]; + even12 = residual[rowStrideIndex + 12] + residual[rowStrideIndex + 19]; + even13 = residual[rowStrideIndex + 13] + residual[rowStrideIndex + 18]; + even14 = residual[rowStrideIndex + 14] + residual[rowStrideIndex + 17]; + even15 = residual[rowStrideIndex + 15] + residual[rowStrideIndex + 16]; + + odd0 = residual[rowStrideIndex + 0] - residual[rowStrideIndex + 31]; + odd1 = residual[rowStrideIndex + 1] - residual[rowStrideIndex + 30]; + odd2 = residual[rowStrideIndex + 2] - residual[rowStrideIndex + 29]; + odd3 = residual[rowStrideIndex + 3] - residual[rowStrideIndex + 28]; + odd4 = residual[rowStrideIndex + 4] - residual[rowStrideIndex + 27]; + odd5 = residual[rowStrideIndex + 5] - residual[rowStrideIndex + 26]; + odd6 = residual[rowStrideIndex + 6] - residual[rowStrideIndex + 25]; + odd7 = residual[rowStrideIndex + 7] - residual[rowStrideIndex + 24]; + odd8 = residual[rowStrideIndex + 8] - residual[rowStrideIndex + 23]; + odd9 = residual[rowStrideIndex + 9] - residual[rowStrideIndex + 22]; + odd10 = residual[rowStrideIndex + 10] - residual[rowStrideIndex + 21]; + odd11 = residual[rowStrideIndex + 11] - residual[rowStrideIndex + 20]; + odd12 = residual[rowStrideIndex + 12] - residual[rowStrideIndex + 19]; + odd13 = residual[rowStrideIndex + 13] - residual[rowStrideIndex + 18]; + odd14 = residual[rowStrideIndex + 14] - residual[rowStrideIndex + 17]; + odd15 = residual[rowStrideIndex + 15] - residual[rowStrideIndex + 16]; + + //Calculating evenEven and evenOdd variables + evenEven0 = even0 + even15; + evenEven1 = even1 + even14; + evenEven2 = even2 + even13; + evenEven3 = even3 + even12; + evenEven4 = even4 + even11; + evenEven5 = even5 + even10; + evenEven6 = even6 + even9; + evenEven7 = even7 + even8; + + evenOdd0 = even0 - even15; + evenOdd1 = even1 - even14; + evenOdd2 = even2 - even13; + evenOdd3 = even3 - even12; + evenOdd4 = even4 - even11; + evenOdd5 = even5 - even10; + evenOdd6 = even6 - even9; + evenOdd7 = even7 - even8; + + //Calculating evenEvenEven and evenEvenOdd variables + evenEvenEven0 = evenEven0 + evenEven7; + evenEvenEven1 = evenEven1 + evenEven6; + evenEvenEven2 = evenEven2 + evenEven5; + evenEvenEven3 = evenEven3 + evenEven4; + + evenEvenOdd0 = evenEven0 - evenEven7; + evenEvenOdd1 = evenEven1 - evenEven6; + evenEvenOdd2 = evenEven2 - evenEven5; + evenEvenOdd3 = evenEven3 - evenEven4; + + //Calculating evenEvenEvenEven and evenEvenEvenOdd variables + evenEvenEvenEven0 = evenEvenEven0 + evenEvenEven3; + evenEvenEvenEven1 = evenEvenEven1 + evenEvenEven2; + + evenEvenEvenOdd0 = evenEvenEven0 - evenEvenEven3; + evenEvenEvenOdd1 = evenEvenEven1 - evenEvenEven2; + + transformCoefficients[0 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[0 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[0 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); + transformCoefficients[8 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[8 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[8 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); + transformCoefficients[16 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[16 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[16 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); + transformCoefficients[24 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[24 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[24 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); + + transformCoefficients[4 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[4 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[4 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[4 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[4 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + transformCoefficients[12 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[12 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[12 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[12 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[12 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + transformCoefficients[20 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[20 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[20 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[20 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[20 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + transformCoefficients[28 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[28 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[28 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[28 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[28 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + + transformCoefficients[2 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[2 * 32 + 0] * evenOdd0 + DctCoef32x32[2 * 32 + 1] * evenOdd1 + + DctCoef32x32[2 * 32 + 2] * evenOdd2 + DctCoef32x32[2 * 32 + 3] * evenOdd3 + + DctCoef32x32[2 * 32 + 4] * evenOdd4 + DctCoef32x32[2 * 32 + 5] * evenOdd5 + + DctCoef32x32[2 * 32 + 6] * evenOdd6 + DctCoef32x32[2 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[6 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[6 * 32 + 0] * evenOdd0 + DctCoef32x32[6 * 32 + 1] * evenOdd1 + + DctCoef32x32[6 * 32 + 2] * evenOdd2 + DctCoef32x32[6 * 32 + 3] * evenOdd3 + + DctCoef32x32[6 * 32 + 4] * evenOdd4 + DctCoef32x32[6 * 32 + 5] * evenOdd5 + + DctCoef32x32[6 * 32 + 6] * evenOdd6 + DctCoef32x32[6 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[10 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[10 * 32 + 0] * evenOdd0 + DctCoef32x32[10 * 32 + 1] * evenOdd1 + + DctCoef32x32[10 * 32 + 2] * evenOdd2 + DctCoef32x32[10 * 32 + 3] * evenOdd3 + + DctCoef32x32[10 * 32 + 4] * evenOdd4 + DctCoef32x32[10 * 32 + 5] * evenOdd5 + + DctCoef32x32[10 * 32 + 6] * evenOdd6 + DctCoef32x32[10 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[14 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[14 * 32 + 0] * evenOdd0 + DctCoef32x32[14 * 32 + 1] * evenOdd1 + + DctCoef32x32[14 * 32 + 2] * evenOdd2 + DctCoef32x32[14 * 32 + 3] * evenOdd3 + + DctCoef32x32[14 * 32 + 4] * evenOdd4 + DctCoef32x32[14 * 32 + 5] * evenOdd5 + + DctCoef32x32[14 * 32 + 6] * evenOdd6 + DctCoef32x32[14 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[18 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[18 * 32 + 0] * evenOdd0 + DctCoef32x32[18 * 32 + 1] * evenOdd1 + + DctCoef32x32[18 * 32 + 2] * evenOdd2 + DctCoef32x32[18 * 32 + 3] * evenOdd3 + + DctCoef32x32[18 * 32 + 4] * evenOdd4 + DctCoef32x32[18 * 32 + 5] * evenOdd5 + + DctCoef32x32[18 * 32 + 6] * evenOdd6 + DctCoef32x32[18 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[22 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[22 * 32 + 0] * evenOdd0 + DctCoef32x32[22 * 32 + 1] * evenOdd1 + + DctCoef32x32[22 * 32 + 2] * evenOdd2 + DctCoef32x32[22 * 32 + 3] * evenOdd3 + + DctCoef32x32[22 * 32 + 4] * evenOdd4 + DctCoef32x32[22 * 32 + 5] * evenOdd5 + + DctCoef32x32[22 * 32 + 6] * evenOdd6 + DctCoef32x32[22 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[26 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[26 * 32 + 0] * evenOdd0 + DctCoef32x32[26 * 32 + 1] * evenOdd1 + + DctCoef32x32[26 * 32 + 2] * evenOdd2 + DctCoef32x32[26 * 32 + 3] * evenOdd3 + + DctCoef32x32[26 * 32 + 4] * evenOdd4 + DctCoef32x32[26 * 32 + 5] * evenOdd5 + + DctCoef32x32[26 * 32 + 6] * evenOdd6 + DctCoef32x32[26 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[30 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[30 * 32 + 0] * evenOdd0 + DctCoef32x32[30 * 32 + 1] * evenOdd1 + + DctCoef32x32[30 * 32 + 2] * evenOdd2 + DctCoef32x32[30 * 32 + 3] * evenOdd3 + + DctCoef32x32[30 * 32 + 4] * evenOdd4 + DctCoef32x32[30 * 32 + 5] * evenOdd5 + + DctCoef32x32[30 * 32 + 6] * evenOdd6 + DctCoef32x32[30 * 32 + 7] * evenOdd7 + offset) >> shift); + + transformCoefficients[1 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[1 * 32 + 0] * odd0 + DctCoef32x32[1 * 32 + 1] * odd1 + DctCoef32x32[1 * 32 + 2] * odd2 + DctCoef32x32[1 * 32 + 3] * odd3 + + DctCoef32x32[1 * 32 + 4] * odd4 + DctCoef32x32[1 * 32 + 5] * odd5 + DctCoef32x32[1 * 32 + 6] * odd6 + DctCoef32x32[1 * 32 + 7] * odd7 + + DctCoef32x32[1 * 32 + 8] * odd8 + DctCoef32x32[1 * 32 + 9] * odd9 + DctCoef32x32[1 * 32 + 10] * odd10 + DctCoef32x32[1 * 32 + 11] * odd11 + + DctCoef32x32[1 * 32 + 12] * odd12 + DctCoef32x32[1 * 32 + 13] * odd13 + DctCoef32x32[1 * 32 + 14] * odd14 + DctCoef32x32[1 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[3 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[3 * 32 + 0] * odd0 + DctCoef32x32[3 * 32 + 1] * odd1 + DctCoef32x32[3 * 32 + 2] * odd2 + DctCoef32x32[3 * 32 + 3] * odd3 + + DctCoef32x32[3 * 32 + 4] * odd4 + DctCoef32x32[3 * 32 + 5] * odd5 + DctCoef32x32[3 * 32 + 6] * odd6 + DctCoef32x32[3 * 32 + 7] * odd7 + + DctCoef32x32[3 * 32 + 8] * odd8 + DctCoef32x32[3 * 32 + 9] * odd9 + DctCoef32x32[3 * 32 + 10] * odd10 + DctCoef32x32[3 * 32 + 11] * odd11 + + DctCoef32x32[3 * 32 + 12] * odd12 + DctCoef32x32[3 * 32 + 13] * odd13 + DctCoef32x32[3 * 32 + 14] * odd14 + DctCoef32x32[3 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[5 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[5 * 32 + 0] * odd0 + DctCoef32x32[5 * 32 + 1] * odd1 + DctCoef32x32[5 * 32 + 2] * odd2 + DctCoef32x32[5 * 32 + 3] * odd3 + + DctCoef32x32[5 * 32 + 4] * odd4 + DctCoef32x32[5 * 32 + 5] * odd5 + DctCoef32x32[5 * 32 + 6] * odd6 + DctCoef32x32[5 * 32 + 7] * odd7 + + DctCoef32x32[5 * 32 + 8] * odd8 + DctCoef32x32[5 * 32 + 9] * odd9 + DctCoef32x32[5 * 32 + 10] * odd10 + DctCoef32x32[5 * 32 + 11] * odd11 + + DctCoef32x32[5 * 32 + 12] * odd12 + DctCoef32x32[5 * 32 + 13] * odd13 + DctCoef32x32[5 * 32 + 14] * odd14 + DctCoef32x32[5 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[7 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[7 * 32 + 0] * odd0 + DctCoef32x32[7 * 32 + 1] * odd1 + DctCoef32x32[7 * 32 + 2] * odd2 + DctCoef32x32[7 * 32 + 3] * odd3 + + DctCoef32x32[7 * 32 + 4] * odd4 + DctCoef32x32[7 * 32 + 5] * odd5 + DctCoef32x32[7 * 32 + 6] * odd6 + DctCoef32x32[7 * 32 + 7] * odd7 + + DctCoef32x32[7 * 32 + 8] * odd8 + DctCoef32x32[7 * 32 + 9] * odd9 + DctCoef32x32[7 * 32 + 10] * odd10 + DctCoef32x32[7 * 32 + 11] * odd11 + + DctCoef32x32[7 * 32 + 12] * odd12 + DctCoef32x32[7 * 32 + 13] * odd13 + DctCoef32x32[7 * 32 + 14] * odd14 + DctCoef32x32[7 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[9 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[9 * 32 + 0] * odd0 + DctCoef32x32[9 * 32 + 1] * odd1 + DctCoef32x32[9 * 32 + 2] * odd2 + DctCoef32x32[9 * 32 + 3] * odd3 + + DctCoef32x32[9 * 32 + 4] * odd4 + DctCoef32x32[9 * 32 + 5] * odd5 + DctCoef32x32[9 * 32 + 6] * odd6 + DctCoef32x32[9 * 32 + 7] * odd7 + + DctCoef32x32[9 * 32 + 8] * odd8 + DctCoef32x32[9 * 32 + 9] * odd9 + DctCoef32x32[9 * 32 + 10] * odd10 + DctCoef32x32[9 * 32 + 11] * odd11 + + DctCoef32x32[9 * 32 + 12] * odd12 + DctCoef32x32[9 * 32 + 13] * odd13 + DctCoef32x32[9 * 32 + 14] * odd14 + DctCoef32x32[9 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[11 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[11 * 32 + 0] * odd0 + DctCoef32x32[11 * 32 + 1] * odd1 + DctCoef32x32[11 * 32 + 2] * odd2 + DctCoef32x32[11 * 32 + 3] * odd3 + + DctCoef32x32[11 * 32 + 4] * odd4 + DctCoef32x32[11 * 32 + 5] * odd5 + DctCoef32x32[11 * 32 + 6] * odd6 + DctCoef32x32[11 * 32 + 7] * odd7 + + DctCoef32x32[11 * 32 + 8] * odd8 + DctCoef32x32[11 * 32 + 9] * odd9 + DctCoef32x32[11 * 32 + 10] * odd10 + DctCoef32x32[11 * 32 + 11] * odd11 + + DctCoef32x32[11 * 32 + 12] * odd12 + DctCoef32x32[11 * 32 + 13] * odd13 + DctCoef32x32[11 * 32 + 14] * odd14 + DctCoef32x32[11 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[13 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[13 * 32 + 0] * odd0 + DctCoef32x32[13 * 32 + 1] * odd1 + DctCoef32x32[13 * 32 + 2] * odd2 + DctCoef32x32[13 * 32 + 3] * odd3 + + DctCoef32x32[13 * 32 + 4] * odd4 + DctCoef32x32[13 * 32 + 5] * odd5 + DctCoef32x32[13 * 32 + 6] * odd6 + DctCoef32x32[13 * 32 + 7] * odd7 + + DctCoef32x32[13 * 32 + 8] * odd8 + DctCoef32x32[13 * 32 + 9] * odd9 + DctCoef32x32[13 * 32 + 10] * odd10 + DctCoef32x32[13 * 32 + 11] * odd11 + + DctCoef32x32[13 * 32 + 12] * odd12 + DctCoef32x32[13 * 32 + 13] * odd13 + DctCoef32x32[13 * 32 + 14] * odd14 + DctCoef32x32[13 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[15 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[15 * 32 + 0] * odd0 + DctCoef32x32[15 * 32 + 1] * odd1 + DctCoef32x32[15 * 32 + 2] * odd2 + DctCoef32x32[15 * 32 + 3] * odd3 + + DctCoef32x32[15 * 32 + 4] * odd4 + DctCoef32x32[15 * 32 + 5] * odd5 + DctCoef32x32[15 * 32 + 6] * odd6 + DctCoef32x32[15 * 32 + 7] * odd7 + + DctCoef32x32[15 * 32 + 8] * odd8 + DctCoef32x32[15 * 32 + 9] * odd9 + DctCoef32x32[15 * 32 + 10] * odd10 + DctCoef32x32[15 * 32 + 11] * odd11 + + DctCoef32x32[15 * 32 + 12] * odd12 + DctCoef32x32[15 * 32 + 13] * odd13 + DctCoef32x32[15 * 32 + 14] * odd14 + DctCoef32x32[15 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[17 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[17 * 32 + 0] * odd0 + DctCoef32x32[17 * 32 + 1] * odd1 + DctCoef32x32[17 * 32 + 2] * odd2 + DctCoef32x32[17 * 32 + 3] * odd3 + + DctCoef32x32[17 * 32 + 4] * odd4 + DctCoef32x32[17 * 32 + 5] * odd5 + DctCoef32x32[17 * 32 + 6] * odd6 + DctCoef32x32[17 * 32 + 7] * odd7 + + DctCoef32x32[17 * 32 + 8] * odd8 + DctCoef32x32[17 * 32 + 9] * odd9 + DctCoef32x32[17 * 32 + 10] * odd10 + DctCoef32x32[17 * 32 + 11] * odd11 + + DctCoef32x32[17 * 32 + 12] * odd12 + DctCoef32x32[17 * 32 + 13] * odd13 + DctCoef32x32[17 * 32 + 14] * odd14 + DctCoef32x32[17 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[19 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[19 * 32 + 0] * odd0 + DctCoef32x32[19 * 32 + 1] * odd1 + DctCoef32x32[19 * 32 + 2] * odd2 + DctCoef32x32[19 * 32 + 3] * odd3 + + DctCoef32x32[19 * 32 + 4] * odd4 + DctCoef32x32[19 * 32 + 5] * odd5 + DctCoef32x32[19 * 32 + 6] * odd6 + DctCoef32x32[19 * 32 + 7] * odd7 + + DctCoef32x32[19 * 32 + 8] * odd8 + DctCoef32x32[19 * 32 + 9] * odd9 + DctCoef32x32[19 * 32 + 10] * odd10 + DctCoef32x32[19 * 32 + 11] * odd11 + + DctCoef32x32[19 * 32 + 12] * odd12 + DctCoef32x32[19 * 32 + 13] * odd13 + DctCoef32x32[19 * 32 + 14] * odd14 + DctCoef32x32[19 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[21 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[21 * 32 + 0] * odd0 + DctCoef32x32[21 * 32 + 1] * odd1 + DctCoef32x32[21 * 32 + 2] * odd2 + DctCoef32x32[21 * 32 + 3] * odd3 + + DctCoef32x32[21 * 32 + 4] * odd4 + DctCoef32x32[21 * 32 + 5] * odd5 + DctCoef32x32[21 * 32 + 6] * odd6 + DctCoef32x32[21 * 32 + 7] * odd7 + + DctCoef32x32[21 * 32 + 8] * odd8 + DctCoef32x32[21 * 32 + 9] * odd9 + DctCoef32x32[21 * 32 + 10] * odd10 + DctCoef32x32[21 * 32 + 11] * odd11 + + DctCoef32x32[21 * 32 + 12] * odd12 + DctCoef32x32[21 * 32 + 13] * odd13 + DctCoef32x32[21 * 32 + 14] * odd14 + DctCoef32x32[21 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[23 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[23 * 32 + 0] * odd0 + DctCoef32x32[23 * 32 + 1] * odd1 + DctCoef32x32[23 * 32 + 2] * odd2 + DctCoef32x32[23 * 32 + 3] * odd3 + + DctCoef32x32[23 * 32 + 4] * odd4 + DctCoef32x32[23 * 32 + 5] * odd5 + DctCoef32x32[23 * 32 + 6] * odd6 + DctCoef32x32[23 * 32 + 7] * odd7 + + DctCoef32x32[23 * 32 + 8] * odd8 + DctCoef32x32[23 * 32 + 9] * odd9 + DctCoef32x32[23 * 32 + 10] * odd10 + DctCoef32x32[23 * 32 + 11] * odd11 + + DctCoef32x32[23 * 32 + 12] * odd12 + DctCoef32x32[23 * 32 + 13] * odd13 + DctCoef32x32[23 * 32 + 14] * odd14 + DctCoef32x32[23 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[25 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[25 * 32 + 0] * odd0 + DctCoef32x32[25 * 32 + 1] * odd1 + DctCoef32x32[25 * 32 + 2] * odd2 + DctCoef32x32[25 * 32 + 3] * odd3 + + DctCoef32x32[25 * 32 + 4] * odd4 + DctCoef32x32[25 * 32 + 5] * odd5 + DctCoef32x32[25 * 32 + 6] * odd6 + DctCoef32x32[25 * 32 + 7] * odd7 + + DctCoef32x32[25 * 32 + 8] * odd8 + DctCoef32x32[25 * 32 + 9] * odd9 + DctCoef32x32[25 * 32 + 10] * odd10 + DctCoef32x32[25 * 32 + 11] * odd11 + + DctCoef32x32[25 * 32 + 12] * odd12 + DctCoef32x32[25 * 32 + 13] * odd13 + DctCoef32x32[25 * 32 + 14] * odd14 + DctCoef32x32[25 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[27 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[27 * 32 + 0] * odd0 + DctCoef32x32[27 * 32 + 1] * odd1 + DctCoef32x32[27 * 32 + 2] * odd2 + DctCoef32x32[27 * 32 + 3] * odd3 + + DctCoef32x32[27 * 32 + 4] * odd4 + DctCoef32x32[27 * 32 + 5] * odd5 + DctCoef32x32[27 * 32 + 6] * odd6 + DctCoef32x32[27 * 32 + 7] * odd7 + + DctCoef32x32[27 * 32 + 8] * odd8 + DctCoef32x32[27 * 32 + 9] * odd9 + DctCoef32x32[27 * 32 + 10] * odd10 + DctCoef32x32[27 * 32 + 11] * odd11 + + DctCoef32x32[27 * 32 + 12] * odd12 + DctCoef32x32[27 * 32 + 13] * odd13 + DctCoef32x32[27 * 32 + 14] * odd14 + DctCoef32x32[27 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[29 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[29 * 32 + 0] * odd0 + DctCoef32x32[29 * 32 + 1] * odd1 + DctCoef32x32[29 * 32 + 2] * odd2 + DctCoef32x32[29 * 32 + 3] * odd3 + + DctCoef32x32[29 * 32 + 4] * odd4 + DctCoef32x32[29 * 32 + 5] * odd5 + DctCoef32x32[29 * 32 + 6] * odd6 + DctCoef32x32[29 * 32 + 7] * odd7 + + DctCoef32x32[29 * 32 + 8] * odd8 + DctCoef32x32[29 * 32 + 9] * odd9 + DctCoef32x32[29 * 32 + 10] * odd10 + DctCoef32x32[29 * 32 + 11] * odd11 + + DctCoef32x32[29 * 32 + 12] * odd12 + DctCoef32x32[29 * 32 + 13] * odd13 + DctCoef32x32[29 * 32 + 14] * odd14 + DctCoef32x32[29 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[31 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[31 * 32 + 0] * odd0 + DctCoef32x32[31 * 32 + 1] * odd1 + DctCoef32x32[31 * 32 + 2] * odd2 + DctCoef32x32[31 * 32 + 3] * odd3 + + DctCoef32x32[31 * 32 + 4] * odd4 + DctCoef32x32[31 * 32 + 5] * odd5 + DctCoef32x32[31 * 32 + 6] * odd6 + DctCoef32x32[31 * 32 + 7] * odd7 + + DctCoef32x32[31 * 32 + 8] * odd8 + DctCoef32x32[31 * 32 + 9] * odd9 + DctCoef32x32[31 * 32 + 10] * odd10 + DctCoef32x32[31 * 32 + 11] * odd11 + + DctCoef32x32[31 * 32 + 12] * odd12 + DctCoef32x32[31 * 32 + 13] * odd13 + DctCoef32x32[31 * 32 + 14] * odd14 + DctCoef32x32[31 * 32 + 15] * odd15 + + offset) >> shift); + } } /********************************************************************* @@ -1632,35 +1632,35 @@ void Transform32x32( } void Transform32x32Estimate( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { - const EB_U32 shift1st = 6 + bitIncrement; // 2;//log2(trasnform size)-1+TRANS_BIT_INCREMENT - const EB_U32 shift2nd = 9; // log2(trasnform size) + 6 + const EB_U32 shift1st = 6 + bitIncrement; // 2;//log2(trasnform size)-1+TRANS_BIT_INCREMENT + const EB_U32 shift2nd = 9; // log2(trasnform size) + 6 - const EB_U32 transformInnerArrayStride = 32; + const EB_U32 transformInnerArrayStride = 32; - PartialButterfly32Estimate( - residual, - transformInnerArrayPtr, - srcStride, - transformInnerArrayStride, - shift1st); + PartialButterfly32Estimate( + residual, + transformInnerArrayPtr, + srcStride, + transformInnerArrayStride, + shift1st); - PartialButterfly32Estimate( - transformInnerArrayPtr, - transformCoefficients, - transformInnerArrayStride, - dstStride, - shift2nd); + PartialButterfly32Estimate( + transformInnerArrayPtr, + transformCoefficients, + transformInnerArrayStride, + dstStride, + shift2nd); - return; + return; } /********************************************************************* diff --git a/Source/Lib/C_DEFAULT/EbTransforms_C.h b/Source/Lib/C_DEFAULT/EbTransforms_C.h index 57e7efd38..93455ec18 100644 --- a/Source/Lib/C_DEFAULT/EbTransforms_C.h +++ b/Source/Lib/C_DEFAULT/EbTransforms_C.h @@ -14,7 +14,7 @@ extern "C" { #define SHIFT_INV_1ST 7 #define SHIFT_INV_2ND 12 - + extern void QuantizeInvQuantize( EB_S16 *coeff, const EB_U32 coeffStride, @@ -27,38 +27,38 @@ extern void QuantizeInvQuantize( const EB_S32 iq_offset, const EB_S32 shiftNum, const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); void UpdateQiQCoef_R( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag); + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag); extern void UpdateQiQCoef( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag); + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag); void Transform32x32( EB_S16 *residual, diff --git a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c index 05b7a8075..d0649d137 100644 --- a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c +++ b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c @@ -16,7 +16,7 @@ #include "EbErrorHandling.h" #include "EbModeDecisionProcess.h" -static const EB_U32 mvMergeCandIndexArrayForFillingUp[2][12] = +static const EB_U32 mvMergeCandIndexArrayForFillingUp[2][12] = { {0 , 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3}, {1 , 0, 2, 0, 2, 1, 3, 0, 3, 1, 3, 2} @@ -87,11 +87,11 @@ static inline EB_BOOL GetNonScalingSpatialAMVP( EbReferenceObject_t *referenceObject; EB_U64 refPicPOC; EB_REFLIST refPicList; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; CHECK_REPORT_ERROR( (neighbourPuPtr != EB_NULL), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR2); if (neighbourPuPtr != EB_NULL) { @@ -152,7 +152,7 @@ static inline EB_BOOL GetNonScalingSpatialAMVP( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR3); } } @@ -164,9 +164,9 @@ static inline EB_BOOL GetNonScalingSpatialAMVP( return availability; } -/** GetNonScalingSpatialAMVP_V2() +/** GetNonScalingSpatialAMVP_V2() is used to generate the spatial AMVP candidate by using the non-scaling method. - + It returns the availability of the spatial AMVP candidate. */ static inline EB_BOOL GetNonScalingSpatialAMVP_V2( @@ -184,50 +184,50 @@ static inline EB_BOOL GetNonScalingSpatialAMVP_V2( EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - + switch(mvUnit->predDirection){ case UNI_PRED_LIST_0: - + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicPOC = referenceObject->refPOC; availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); if(availability){ - *MVPCandx = mvUnit->mv[REF_LIST_0].x; - *MVPCandy = mvUnit->mv[REF_LIST_0].y; + *MVPCandx = mvUnit->mv[REF_LIST_0].x; + *MVPCandy = mvUnit->mv[REF_LIST_0].y; } - + break; case UNI_PRED_LIST_1: referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; refPicPOC = referenceObject->refPOC; - availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); + availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); if(availability){ - *MVPCandx = mvUnit->mv[REF_LIST_1].x; - *MVPCandy = mvUnit->mv[REF_LIST_1].y; + *MVPCandx = mvUnit->mv[REF_LIST_1].x; + *MVPCandy = mvUnit->mv[REF_LIST_1].y; } break; case BI_PRED: - // Check the AMVP in targetRefPicList - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[targetRefPicList]->objectPtr; + // Check the AMVP in targetRefPicList + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[targetRefPicList]->objectPtr; refPicPOC = referenceObject->refPOC; availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); - if(availability){ - *MVPCandx = mvUnit->mv[targetRefPicList].x; - *MVPCandy = mvUnit->mv[targetRefPicList].y; + if(availability){ + *MVPCandx = mvUnit->mv[targetRefPicList].x; + *MVPCandy = mvUnit->mv[targetRefPicList].y; }else{ // Check the AMVP in 1 - targetRefPicList - refPicList = (EB_REFLIST) (1 - targetRefPicList); - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[refPicList]->objectPtr; + refPicList = (EB_REFLIST) (1 - targetRefPicList); + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[refPicList]->objectPtr; refPicPOC = referenceObject->refPOC; - availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); + availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); *MVPCandx = mvUnit->mv[refPicList].x; *MVPCandy = mvUnit->mv[refPicList].y; - + } break; @@ -241,7 +241,7 @@ static inline EB_BOOL GetNonScalingSpatialAMVP_V2( return availability; } - /** GetScalingSpatialAMVP() + /** GetScalingSpatialAMVP() is used to generate the spatial AMVP candidate by using the scaling method. */ static inline EB_BOOL GetScalingSpatialAMVP_V2( @@ -258,22 +258,22 @@ static inline EB_BOOL GetScalingSpatialAMVP_V2( EB_U64 refPicPOC; EB_REFLIST refPicList ; - + curPicPOC = pictureControlSetPtr->pictureNumber; - - + + if(mvUnit->predDirection == BI_PRED) refPicList = targetRefPicList; else refPicList = (EB_REFLIST)mvUnit->predDirection; - + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[refPicList]->objectPtr; refPicPOC = referenceObject->refPOC; - - *MVPCandx = mvUnit->mv[refPicList].x; - *MVPCandy = mvUnit->mv[refPicList].y; + + *MVPCandx = mvUnit->mv[refPicList].x; + *MVPCandy = mvUnit->mv[refPicList].y; ScaleMV( curPicPOC, @@ -303,10 +303,10 @@ static inline EB_BOOL GetScalingSpatialAMVP( EB_U64 refPicPOC; EB_REFLIST refPicList = REF_LIST_0; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; /*CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR7);*/ curPicPOC = pictureControlSetPtr->pictureNumber; @@ -330,7 +330,7 @@ static inline EB_BOOL GetScalingSpatialAMVP( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR1); } @@ -372,7 +372,7 @@ static EB_BOOL GetSpatialMVPPosAx( EB_U8 puAvailability = (EB_U8) puA0Availability + (((EB_U8) puA1Availability) << 1); EB_BOOL MVPAxAvailability = EB_FALSE; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; switch(puAvailability) { @@ -454,30 +454,30 @@ static EB_BOOL GetSpatialMVPPosAx( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR4); break; } return MVPAxAvailability; } - -/** GetSpatialMVPPosAx_V3() - same as GetSpatialMVPPosAx - is used to generate the spatial MVP candidate in position A0 or A1 (if needed). - It returns the availability of the candidate. + +/** GetSpatialMVPPosAx_V3() + same as GetSpatialMVPPosAx + is used to generate the spatial MVP candidate in position A0 or A1 (if needed). + It returns the availability of the candidate. */ static EB_BOOL GetSpatialMVPPosAx_V3( - MvUnit_t *mvUnitA0, // Input parameter, PU pointer of position A0. - MvUnit_t *mvUnitA1, // Input parameter, PU pointer of position A1. - EB_U8 puAvailability, + MvUnit_t *mvUnitA0, // Input parameter, PU pointer of position A0. + MvUnit_t *mvUnitA1, // Input parameter, PU pointer of position A1. + EB_U8 puAvailability, EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the AMVP is searching for. EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the AMVP is searcing for. EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. PictureControlSet_t *pictureControlSetPtr) { - + EB_BOOL MVPAxAvailability = EB_FALSE; EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; @@ -561,11 +561,11 @@ static EB_BOOL GetSpatialMVPPosAx_V3( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR4); + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR4); break; } - + return MVPAxAvailability; } @@ -595,7 +595,7 @@ static EB_BOOL GetNonScalingSpatialMVPPosBx( EB_BOOL puB2Availability = (EB_BOOL) (puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); EB_U8 puAvailability = (EB_U8) puB0Availability + (((EB_U8) puB1Availability) << 1) + (((EB_U8) puB2Availability) << 2); - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; switch(puAvailability) { @@ -732,9 +732,9 @@ static EB_BOOL GetNonScalingSpatialMVPPosBx( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR5); - break; + break; } return MVPBxAvailability; @@ -767,7 +767,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx( EB_BOOL puB2Availability = (EB_BOOL)(puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); EB_U8 puAvailability = (EB_U8)puB0Availability + (((EB_U8)puB1Availability)<<1) + (((EB_U8)puB2Availability<<2)); - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; switch(puAvailability) { @@ -910,7 +910,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR4); break; } @@ -924,181 +924,181 @@ is used to generate the spatial MVP candidate in position B0, B1 (if needed) or and no MV scaling is used. */ static EB_BOOL GetNonScalingSpatialMVPPosBx_V3( - //PredictionUnit_t *puB0Ptr, PredictionUnit_t *puB1Ptr, PredictionUnit_t *puB2Ptr, - MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. - MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. - MvUnit_t *mvUnitB2, // Input parameter, PU pointer of position B2. - EB_U8 puAvailability, - //EB_BOOL puB0Available, - //EB_BOOL puB1Available, - //EB_BOOL puB2Available, - //EB_MODETYPE puB0CodingMode, - //EB_MODETYPE puB1CodingMode, - //EB_MODETYPE puB2CodingMode, - EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the AMVP is searching for. - EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the AMVP is searcing for. - EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. - EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. - PictureControlSet_t *pictureControlSetPtr) + //PredictionUnit_t *puB0Ptr, PredictionUnit_t *puB1Ptr, PredictionUnit_t *puB2Ptr, + MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. + MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. + MvUnit_t *mvUnitB2, // Input parameter, PU pointer of position B2. + EB_U8 puAvailability, + //EB_BOOL puB0Available, + //EB_BOOL puB1Available, + //EB_BOOL puB2Available, + //EB_MODETYPE puB0CodingMode, + //EB_MODETYPE puB1CodingMode, + //EB_MODETYPE puB2CodingMode, + EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the AMVP is searching for. + EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the AMVP is searcing for. + EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. + EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. + PictureControlSet_t *pictureControlSetPtr) { - //CHKN move these avail outside - EB_BOOL MVPBxAvailability = EB_FALSE; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - //EB_BOOL puB0Availability = (EB_BOOL) (puB0Available == EB_TRUE && puB0CodingMode != INTRA_MODE); - //EB_BOOL puB1Availability = (EB_BOOL) (puB1Available == EB_TRUE && puB1CodingMode != INTRA_MODE); - //EB_BOOL puB2Availability = (EB_BOOL) (puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); - //EB_U8 puAvailability = (EB_U8) puB0Availability + (((EB_U8) puB1Availability) << 1) + (((EB_U8) puB2Availability) << 2); - - switch (puAvailability){ - - case 1: // only B0 is available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - break; - - case 2: // only B1 is available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - break; - - case 3: // only B0 & B1 are available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - } - - break; - - case 4: // only B2 is available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - break; - - case 5: // only B0 & B2 are available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - } - - break; - - case 6: // only B1 & B2 are available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - } - - break; - - case 7: // B0, B1 & B2 are all available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - } - } - - break; - - case 0: // none of B0, B1 or B2 is available - break; - - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR5); - break; - } - - return MVPBxAvailability; + //CHKN move these avail outside + EB_BOOL MVPBxAvailability = EB_FALSE; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + //EB_BOOL puB0Availability = (EB_BOOL) (puB0Available == EB_TRUE && puB0CodingMode != INTRA_MODE); + //EB_BOOL puB1Availability = (EB_BOOL) (puB1Available == EB_TRUE && puB1CodingMode != INTRA_MODE); + //EB_BOOL puB2Availability = (EB_BOOL) (puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); + //EB_U8 puAvailability = (EB_U8) puB0Availability + (((EB_U8) puB1Availability) << 1) + (((EB_U8) puB2Availability) << 2); + + switch (puAvailability){ + + case 1: // only B0 is available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + break; + + case 2: // only B1 is available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + break; + + case 3: // only B0 & B1 are available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + } + + break; + + case 4: // only B2 is available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + break; + + case 5: // only B0 & B2 are available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + } + + break; + + case 6: // only B1 & B2 are available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + } + + break; + + case 7: // B0, B1 & B2 are all available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + } + } + + break; + + case 0: // none of B0, B1 or B2 is available + break; + + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR5); + break; + } + + return MVPBxAvailability; } /** GetScalingSpatialMVPPosBx_V3() is used to generate the spatial MVP candidate in position B0, B1 (if needed) or B2 (if needed) and the MV scaling is used. */ -static EB_BOOL GetScalingSpatialMVPPosBx_V3( - MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. - MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. +static EB_BOOL GetScalingSpatialMVPPosBx_V3( + MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. + MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. MvUnit_t *mvUnitB2, // Input parameter, PU pointer of position B2. EB_U8 puAvailability, //EB_BOOL puB0Available, @@ -1123,7 +1123,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( switch(puAvailability){ case 1: // only B0 is available - + MVPBxAvailability = GetScalingSpatialAMVP_V2( mvUnitB0, targetRefPicList, @@ -1181,7 +1181,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( break; case 5: // only B0 & B2 are available - + MVPBxAvailability = GetScalingSpatialAMVP_V2( mvUnitB0, targetRefPicList, @@ -1261,8 +1261,8 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR5); + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR5); break; } @@ -1272,7 +1272,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( /** GetTemporalMVP() is used to generate the temporal MVP candidate. */ -EB_BOOL GetTemporalMVP( +EB_BOOL GetTemporalMVP( EB_U32 puPicWiseLocX, EB_U32 puPicWiseLocY, EB_U32 puWidth, @@ -1305,7 +1305,7 @@ EB_BOOL GetTemporalMVP( EB_BOOL temporalMVPAvailability = EB_FALSE; EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - + //CHKN compute this outside (remove isLowdelay/targetRefPicList/preDefinedColocatedPuRefList //CHKN bottom right avail outside, common between L0+L1, tmvpPosition is common between L0+L1 @@ -1313,7 +1313,7 @@ EB_BOOL GetTemporalMVP( - + //CHKN this if/else is common between L0+L1 if( (puPicWiseLocX + puWidth) >= pictureWidth || // Right Picture Edge Boundary Check @@ -1332,9 +1332,9 @@ EB_BOOL GetTemporalMVP( bottomRightBlockPositionY = ((puPicWiseLocY & (tbSize-1)) + puHeight) >> LOG_MV_COMPRESS_UNIT_SIZE; // won't rollover due to prior boundary checks CHECK_REPORT_ERROR( - ((tmvpMapLcuIndexOffset < 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR8); + ((tmvpMapLcuIndexOffset < 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR8); tmvpMapPuIndex = bottomRightBlockPositionY * (tbSize >> LOG_MV_COMPRESS_UNIT_SIZE) + bottomRightBlockPositionX; @@ -1387,28 +1387,28 @@ EB_BOOL GetTemporalMVP( return temporalMVPAvailability; } - + /** GetTemporalMVP_V2() is used to generate the temporal MVP candidate. */ -EB_BOOL GetTemporalMVP_V2( +EB_BOOL GetTemporalMVP_V2( TmvpPos tmvpPosition, EB_U32 tmvpMapLcuIndexOffset, EB_U32 tmvpMapPuIndex, - EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the TMVP is searching for. + EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the TMVP is searching for. EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the TMVP is searcing for. TmvpUnit_t *tmvpMapPtr, // Input parameter, the pointer to the TMVP map. EB_U64 colocatedPuPOC, // Input parameter, the POC of the co-located PU. - EB_REFLIST preDefinedColocatedPuRefList, // Input parameter, the reference picture list of the co-located PU, which is defined in the slice header. + EB_REFLIST preDefinedColocatedPuRefList, // Input parameter, the reference picture list of the co-located PU, which is defined in the slice header. EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. PictureControlSet_t *pictureControlSetPtr) { - + EB_BOOL temporalMVPAvailability = EB_FALSE; EB_REFLIST colocatedPuRefList = pictureControlSetPtr->isLowDelay ? targetRefPicList : (EB_REFLIST) (1-preDefinedColocatedPuRefList); - + if(tmvpPosition == TmvpColocatedBottomRight) { colocatedPuRefList = tmvpMapPtr[tmvpMapLcuIndexOffset].predictionDirection[tmvpMapPuIndex] == BI_PRED ? colocatedPuRefList : @@ -1426,7 +1426,7 @@ EB_BOOL GetTemporalMVP_V2( MVPCandx, MVPCandy); } - else { // (tmvpType == TmvpColocatedCenter) + else { // (tmvpType == TmvpColocatedCenter) temporalMVPAvailability = tmvpMapPtr->availabilityFlag[tmvpMapPuIndex]; if(temporalMVPAvailability) { @@ -1502,7 +1502,7 @@ EB_BOOL GetTemporalMVPBPicture( CHECK_REPORT_ERROR( (tmvpMapLcuIndexOffset < 2), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR8); tmvpMapPuIndex = bottomRightBlockPositionY * (tbSize >> LOG_MV_COMPRESS_UNIT_SIZE) + bottomRightBlockPositionX; @@ -1760,9 +1760,9 @@ EB_ERRORTYPE FillAMVPCandidates( EB_BOOL tmvpEnableFlag, EB_U32 tbAddr, EB_REFLIST targetRefPicList, - EB_S16 *xMvAmvpArray, - EB_S16 *yMvAmvpArray, - EB_U8 *amvpCandidateCount) + EB_S16 *xMvAmvpArray, + EB_S16 *yMvAmvpArray, + EB_U8 *amvpCandidateCount) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -1841,8 +1841,8 @@ EB_ERRORTYPE FillAMVPCandidates( EB_REFLIST colocatedPuRefList; const EB_U64 targetRefPicPOC =((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[targetRefPicList]->objectPtr)->refPOC; - EB_S16 xMVPCandArray[4]; - EB_S16 yMVPCandArray[4]; + EB_S16 xMVPCandArray[4]; + EB_S16 yMVPCandArray[4]; EB_S16 xMVPCand; EB_S16 yMVPCand; EB_U32 numAvailableMVPCand = 0; @@ -1863,7 +1863,7 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture & Intra Check a0_availability = (modeNeighborArray->leftArray[a0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : a0_availability; - a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; + a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; if(a0_availability) { @@ -1881,9 +1881,9 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture, & Intra Check a1_availability = (modeNeighborArray->leftArray[a1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; - a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; + a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; - // To check: Intra-CU check (imposed by the standard to facilitate concurrent PU searches) + // To check: Intra-CU check (imposed by the standard to facilitate concurrent PU searches) // a1_availability = (partIndex == 1 && isVerticalPartition == EB_TRUE) ? EB_FALSE : a1_availability; if (a1_availability) { @@ -1901,7 +1901,7 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture, & Intra Check b2_availability = (modeNeighborArray->topLeftArray[b2_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; - b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; + b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; if (b2_availability) { puB2CodingMode = modeNeighborArray->topLeftArray[b2_ModeNaIndex]; @@ -1943,7 +1943,7 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture & Intra Check b0_availability = (modeNeighborArray->topArray[b0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : b0_availability; - b0_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b0_availability; + b0_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b0_availability; b0_availability = (pictureRightBoundary == EB_TRUE) ? EB_FALSE : b0_availability; if (b0_availability) { @@ -2099,48 +2099,48 @@ EB_ERRORTYPE FillAMVPCandidates( /************************************************************************** * GenerateL0L1AmvpMergeLists() * Generates the AMVP(L0+L1) + MV merge candidates for a PU. - * - * B2 | B1 | B0 + * + * B2 | B1 | B0 * ----------------------- - * | | - * | | - * | | - * | | - * | | - * | | - * | | - * A1 | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * A1 | | * --|-------------------| * A0 - * + * ***************************************************************************/ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( - ModeDecisionContext_t *contextPtr, - InterPredictionContext_t *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL tmvpEnableFlag, - EB_U32 tbAddr, - EB_S16 xMvAmvpArray[2][2], - EB_S16 yMvAmvpArray[2][2], - EB_U32 amvpCandidateCount[2], + ModeDecisionContext_t *contextPtr, + InterPredictionContext_t *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL tmvpEnableFlag, + EB_U32 tbAddr, + EB_S16 xMvAmvpArray[2][2], + EB_S16 yMvAmvpArray[2][2], + EB_U32 amvpCandidateCount[2], EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ) { EB_ERRORTYPE return_error = EB_ErrorNone; - NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; - NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; - MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; + NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; + NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; + MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; - const EB_U32 cuIndex = contextPtr->cuStats->cuNumInDepth; - const EB_U32 originX = contextPtr->cuOriginX; - const EB_U32 originY = contextPtr->cuOriginY; - const EB_U32 width = contextPtr->cuStats->size; - const EB_U32 height = contextPtr->cuStats->size; - const EB_U32 cuDepth = contextPtr->cuStats->depth; + const EB_U32 cuIndex = contextPtr->cuStats->cuNumInDepth; + const EB_U32 originX = contextPtr->cuOriginX; + const EB_U32 originY = contextPtr->cuOriginY; + const EB_U32 width = contextPtr->cuStats->size; + const EB_U32 height = contextPtr->cuStats->size; + const EB_U32 cuDepth = contextPtr->cuStats->depth; EB_U32 *mergeCandidateCount = &interPredictionPtr->mvMergeCandidateCount; EB_REFLIST targetRefPicList = REF_LIST_0; - + // Neighbor Array Fixed-indicies const EB_U32 a0_ModeNaIndex = GetNeighborArrayUnitLeftIndex( modeNeighborArray, @@ -2200,14 +2200,14 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( EbReferenceObject_t *referenceObjectReadPtr; TmvpUnit_t *tmvpMapPtr; EB_REFLIST colocatedPuRefList; - + EB_U64 targetRefPicPOC; EB_U32 mvMergeCandidateIndex = 0; EB_S16 MVPCandx; EB_S16 MVPCandy; - EB_S16 MVPCand[4]; + EB_S16 MVPCand[4]; // MV merge candidate array filling up EB_U32 fillingIndex; @@ -2234,7 +2234,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( EB_U32 numAvailableMVPCandL0 = 0; EB_U32 numAvailableMVPCandL1 = 0; - + EB_U32 totalMergeCandidates = *mergeCandidateCount; EB_BOOL tmvpInfoReady = EB_FALSE; @@ -2251,69 +2251,69 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // Availability Checks for A0, A1, B0, B1, B2 //---------------------------------------------- // *********** A0 *********** - + // CU scan-order availability check a0_availability = isBottomLeftAvailable(cuDepth, cuIndex); // Picture Boundary Check a0_availability = (a0_ModeNaIndex < modeNeighborArray->leftArraySize) ? a0_availability : EB_FALSE; - // Slice & Intra Check + // Slice & Intra Check a0_availability = (((EB_MODETYPE*) modeNeighborArray->leftArray)[a0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : a0_availability; // picture Check - a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; + a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; - if(a0_availability){ + if(a0_availability){ mvUnitA0 = &( (MvUnit_t*)mvNeighborArray->leftArray )[a0_MvNaIndex]; } else{ - mvUnitA0 = (MvUnit_t*)EB_NULL; + mvUnitA0 = (MvUnit_t*)EB_NULL; } // *********** A1 *********** - + // Slice & Intra Check a1_availability = (((EB_MODETYPE*) modeNeighborArray->leftArray)[a1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; - - if (a1_availability) { + a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; + + if (a1_availability) { mvUnitA1 = &( (MvUnit_t*)mvNeighborArray->leftArray )[a1_MvNaIndex]; } else { - mvUnitA1 = (MvUnit_t*)EB_NULL; + mvUnitA1 = (MvUnit_t*)EB_NULL; } // *********** B2 *********** - + // Slice & Intra Check b2_availability = (((EB_MODETYPE*) modeNeighborArray->topLeftArray)[b2_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; - - if (b2_availability) { + b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; + + if (b2_availability) { mvUnitB2 = &( (MvUnit_t*)mvNeighborArray->topLeftArray )[b2_MvNaIndex]; } else { - mvUnitB2 = (MvUnit_t*)EB_NULL; + mvUnitB2 = (MvUnit_t*)EB_NULL; } - + // *********** B1 *********** - + // Slice & Intra Check b1_availability = (((EB_MODETYPE*) modeNeighborArray->topArray)[b1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check b1_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b1_availability; - if (b1_availability) { + if (b1_availability) { mvUnitB1 = &( (MvUnit_t*)mvNeighborArray->topArray )[b1_MvNaIndex]; } else { - mvUnitB1 = (MvUnit_t*)EB_NULL; + mvUnitB1 = (MvUnit_t*)EB_NULL; } // *********** B0 *********** @@ -2324,21 +2324,21 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // Picture Boundary Check b0_availability = (b0_ModeNaIndex < modeNeighborArray->topArraySize) ? b0_availability : EB_FALSE; - // Slice & Intra Check + // Slice & Intra Check b0_availability = (((EB_MODETYPE*) modeNeighborArray->topArray)[b0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : b0_availability; // picture Check b0_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b0_availability; b0_availability = (pictureRightBoundary == EB_TRUE) ? EB_FALSE : b0_availability; - if (b0_availability) { + if (b0_availability) { mvUnitB0 = &( (MvUnit_t*)mvNeighborArray->topArray )[b0_MvNaIndex]; } else { - mvUnitB0 = (MvUnit_t*)EB_NULL; + mvUnitB0 = (MvUnit_t*)EB_NULL; } - //-----------------AMVP L0------------- + //-----------------AMVP L0------------- //-----------------AMVP L0------------- //-----------------AMVP L0------------- @@ -2495,9 +2495,9 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( amvpCandidateCount[REF_LIST_0] = numAvailableMVPCandL0; - //------------------AMVP L1-------------- - //------------------AMVP L1-------------- - //------------------AMVP L1-------------- + //------------------AMVP L1-------------- + //------------------AMVP L1-------------- + //------------------AMVP L1-------------- if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { targetRefPicList = REF_LIST_1; @@ -2557,7 +2557,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } } - // Remove duplicate + // Remove duplicate if (numAvailableMVPCandL1 == 2 && ((xMvAmvpArrayL1[0] == xMvAmvpArrayL1[1]) && (yMvAmvpArrayL1[0] == yMvAmvpArrayL1[1]))) { numAvailableMVPCandL1 = 1; } @@ -2628,7 +2628,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } } - //fill (0,0) MVP in case there is no Candidates + //fill (0,0) MVP in case there is no Candidates if ((numAvailableMVPCandL1 < 1) || (numAvailableMVPCandL1 == 1 && xMvAmvpArrayL1[0] != 0 && yMvAmvpArrayL1[0] != 0)) { xMvAmvpArrayL1[numAvailableMVPCandL1] = 0; yMvAmvpArrayL1[numAvailableMVPCandL1] = 0; @@ -2641,18 +2641,18 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } } - //------------------Merge-------------- - //------------------Merge-------------- - //------------------Merge-------------- - + //------------------Merge-------------- + //------------------Merge-------------- + //------------------Merge-------------- + //---------------------------------------- // Candidate Selection //---------------------------------------- - switch(pictureControlSetPtr->sliceType) + switch(pictureControlSetPtr->sliceType) { - + case EB_P_PICTURE: // A1 @@ -2668,13 +2668,13 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( if(mvMergeCandidateIndex == totalMergeCandidates ) break; - // B1 + // B1 if (mvUnitB1 != (MvUnit_t*)EB_NULL) { EB_BOOL mvUnion = EB_FALSE; if (mvUnitB1 != (MvUnit_t*)EB_NULL && mvUnitA1 != (MvUnit_t*)EB_NULL) mvUnion = (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion); if( ( b1_availability == EB_TRUE) && - ( (a1_availability == EB_FALSE) || + ( (a1_availability == EB_FALSE) || mvUnion)) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -2685,14 +2685,14 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( if(mvMergeCandidateIndex == totalMergeCandidates ) break; - + // B0 if (mvUnitB0 != (MvUnit_t*)EB_NULL) { EB_BOOL mvUnion = EB_FALSE; if (mvUnitB0 != (MvUnit_t*)EB_NULL && mvUnitB1 != (MvUnit_t*)EB_NULL) mvUnion = (mvUnitB0->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion); if ( (b0_availability == EB_TRUE) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || mvUnion)) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -2710,7 +2710,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( if (mvUnitA0 != (MvUnit_t*)EB_NULL && mvUnitA1 != (MvUnit_t*)EB_NULL) mvUnion = (mvUnitA0->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion); if ((a0_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || mvUnion)) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -2740,7 +2740,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( ++mvMergeCandidateIndex; } } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; @@ -2757,7 +2757,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( referenceObjectReadPtr->refPOC, preDefinedColocatedPuRefList, isLowDelay, - MAX_LCU_SIZE, + MAX_LCU_SIZE, &MVPCandx, &MVPCandy, pictureControlSetPtr); @@ -2798,16 +2798,16 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].mvUnion = mvUnitA1->mv[REF_LIST_1].mvUnion; ++mvMergeCandidateIndex; } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; - - + + // B1 if ( (b1_availability == EB_TRUE) && ( (a1_availability == EB_FALSE) || - (mvUnitB1->predDirection != mvUnitA1->predDirection) || - (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || + (mvUnitB1->predDirection != mvUnitA1->predDirection) || + (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB1->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) ) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = mvUnitB1->predDirection; @@ -2821,7 +2821,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // B0 if ( (b0_availability == EB_TRUE) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || (mvUnitB0->predDirection != mvUnitB1->predDirection) || (mvUnitB0->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion) || (mvUnitB0->mv[REF_LIST_1].mvUnion != mvUnitB1->mv[REF_LIST_1].mvUnion))) @@ -2837,7 +2837,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // A0 if ( (a0_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || (mvUnitA0->predDirection != mvUnitA1->predDirection) || (mvUnitA0->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitA0->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion))) @@ -2853,11 +2853,11 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // B2 if ( mvMergeCandidateIndex < 4 && (b2_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitA1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitB1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitB1->mv[REF_LIST_1].mvUnion))) @@ -2888,7 +2888,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( { // Center co-located tmvpPosition = TmvpColocatedCenter; - + } else { // Bottom-right co-located bottomRightPositionX = (originX & (63)) + width; @@ -2896,13 +2896,13 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( bottomRightBlockPositionX = (bottomRightPositionX & (63)) >> LOG_MV_COMPRESS_UNIT_SIZE; bottomRightBlockPositionY = ((originY & (63)) + height) >> LOG_MV_COMPRESS_UNIT_SIZE; // won't rollover due to prior boundary checks - + tmvpMapPuIndex = bottomRightBlockPositionY * (MAX_LCU_SIZE >> LOG_MV_COMPRESS_UNIT_SIZE) + bottomRightBlockPositionX; // Determine whether the Bottom-Right is Available tmvpPosition = (tmvpMapPtr[tmvpMapLcuIndexOffset].availabilityFlag[tmvpMapPuIndex] == EB_TRUE) ? TmvpColocatedBottomRight : TmvpColocatedCenter; } - + if(tmvpPosition == TmvpColocatedCenter) { tmvpMapLcuIndexOffset = 0; bottomRightBlockPositionX = ((originX & (63)) + (width >> 1)) >> LOG_MV_COMPRESS_UNIT_SIZE; @@ -2911,19 +2911,19 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } - } + } tmvp_availability = GetTemporalMVPBPicture_V2( tmvpPosition, tmvpMapLcuIndexOffset, - tmvpMapPuIndex, + tmvpMapPuIndex, pictureControlSetPtr, tmvpMapPtr, referenceObjectReadPtr->refPOC, pictureControlSetPtr->colocatedPuRefList, - pictureControlSetPtr->isLowDelay, + pictureControlSetPtr->isLowDelay, MVPCand); - + if(tmvp_availability) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = BI_PRED; @@ -2942,7 +2942,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // Bi-pred Combinations // The MVs from the lists from the the {A0,A1,B0,B1,B2} are combined to create new merge candidates loopEnd = mvMergeCandidateIndex * (mvMergeCandidateIndex - 1); - for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { + for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { list0FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_0][fillingIndex]; list1FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_1][fillingIndex]; @@ -2972,7 +2972,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( break; // Add zero MV - for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) + for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = BI_PRED; mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_0].x = 0; @@ -2981,7 +2981,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].y = 0; ++mvMergeCandidateIndex; } - + break; @@ -2989,7 +2989,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( break; } - // Update the number of MV merge candidate + // Update the number of MV merge candidate *mergeCandidateCount = mvMergeCandidateIndex; //TODO: remove this tmp buffering firstPuAMVPCandArray_x[REF_LIST_0][0] = xMvAmvpArray[REF_LIST_0][0]; @@ -3006,23 +3006,23 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( - ModeDecisionContext_t *contextPtr, - InterPredictionContext_t *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 tbAddr) { + ModeDecisionContext_t *contextPtr, + InterPredictionContext_t *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 tbAddr) { EB_ERRORTYPE return_error = EB_ErrorNone; - NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; - NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; - MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; + NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; + NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; + MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; - const EB_U32 originX = contextPtr->cuOriginX; - const EB_U32 originY = contextPtr->cuOriginY; - const EB_U32 width = contextPtr->cuStats->size; - const EB_U32 height = contextPtr->cuStats->size; + const EB_U32 originX = contextPtr->cuOriginX; + const EB_U32 originY = contextPtr->cuOriginY; + const EB_U32 width = contextPtr->cuStats->size; + const EB_U32 height = contextPtr->cuStats->size; EB_U32 *mergeCandidateCount = &interPredictionPtr->mvMergeCandidateCount; - + // Neighbor Array Fixed-indicies const EB_U32 a1_ModeNaIndex = GetNeighborArrayUnitLeftIndex( modeNeighborArray, @@ -3069,7 +3069,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( MvUnit_t *mvUnitA1; MvUnit_t *mvUnitB2; MvUnit_t *mvUnitB1; - + EB_U32 totalMergeCandidates = *mergeCandidateCount; //---------------------------------------------- @@ -3077,57 +3077,57 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( //---------------------------------------------- // *********** A1 *********** - + // Slice & Intra Check a1_availability = (((EB_MODETYPE*) modeNeighborArray->leftArray)[a1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; - - if (a1_availability) { + a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; + + if (a1_availability) { mvUnitA1 = &( (MvUnit_t*)mvNeighborArray->leftArray )[a1_MvNaIndex]; } else { - mvUnitA1 = (MvUnit_t*)EB_NULL; + mvUnitA1 = (MvUnit_t*)EB_NULL; } // *********** B2 *********** - + // Slice & Intra Check b2_availability = (((EB_MODETYPE*) modeNeighborArray->topLeftArray)[b2_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; - - if (b2_availability) { + b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; + + if (b2_availability) { mvUnitB2 = &( (MvUnit_t*)mvNeighborArray->topLeftArray )[b2_MvNaIndex]; } else { - mvUnitB2 = (MvUnit_t*)EB_NULL; + mvUnitB2 = (MvUnit_t*)EB_NULL; } - + // *********** B1 *********** - + // Slice & Intra Check b1_availability = (((EB_MODETYPE*) modeNeighborArray->topArray)[b1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - b1_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b1_availability; + b1_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b1_availability; - if (b1_availability) { + if (b1_availability) { mvUnitB1 = &( (MvUnit_t*)mvNeighborArray->topArray )[b1_MvNaIndex]; } else { - mvUnitB1 = (MvUnit_t*)EB_NULL; + mvUnitB1 = (MvUnit_t*)EB_NULL; } //---------------------------------------- // Candidate Selection //---------------------------------------- - switch(pictureControlSetPtr->sliceType) + switch(pictureControlSetPtr->sliceType) { - + case EB_P_PICTURE: // A1 @@ -3141,9 +3141,9 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( if(mvMergeCandidateIndex == totalMergeCandidates ) break; - // B1 + // B1 if( ( b1_availability == EB_TRUE) && - ( (a1_availability == EB_FALSE) || + ( (a1_availability == EB_FALSE) || (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion))) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -3164,7 +3164,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_0].mvUnion = mvUnitB2->mv[REF_LIST_0].mvUnion; ++mvMergeCandidateIndex; } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; @@ -3191,16 +3191,16 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].mvUnion = mvUnitA1->mv[REF_LIST_1].mvUnion; ++mvMergeCandidateIndex; } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; - - + + // B1 if ( (b1_availability == EB_TRUE) && ( (a1_availability == EB_FALSE) || - (mvUnitB1->predDirection != mvUnitA1->predDirection) || - (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || + (mvUnitB1->predDirection != mvUnitA1->predDirection) || + (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB1->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) ) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = mvUnitB1->predDirection; @@ -3215,11 +3215,11 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( // B2 if ( mvMergeCandidateIndex < 4 && (b2_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitA1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitB1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitB1->mv[REF_LIST_1].mvUnion))) @@ -3236,7 +3236,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( // Bi-pred Combinations // The MVs from the lists from the the {A1,B1,B2} are combined to create new merge candidates loopEnd = mvMergeCandidateIndex * (mvMergeCandidateIndex - 1); - for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { + for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { list0FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_0][fillingIndex]; list1FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_1][fillingIndex]; @@ -3266,7 +3266,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( break; // Add zero MV - for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) + for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = BI_PRED; mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_0].x = 0; @@ -3275,7 +3275,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].y = 0; ++mvMergeCandidateIndex; } - + break; @@ -3283,7 +3283,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( break; } - // Update the number of MV merge candidate + // Update the number of MV merge candidate *mergeCandidateCount = mvMergeCandidateIndex; return return_error; diff --git a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h index 7ccdb66ac..909465234 100644 --- a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h +++ b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h @@ -26,10 +26,10 @@ typedef enum TmvpPos { // TMVP items corresponding to one LCU typedef struct TmvpUnit_s { - Mv_t mv[MAX_NUM_OF_REF_PIC_LIST][MAX_TMVP_CAND_PER_LCU]; + Mv_t mv[MAX_NUM_OF_REF_PIC_LIST][MAX_TMVP_CAND_PER_LCU]; EB_U64 refPicPOC[MAX_NUM_OF_REF_PIC_LIST][MAX_TMVP_CAND_PER_LCU]; EB_PREDDIRECTION predictionDirection[MAX_TMVP_CAND_PER_LCU]; - EB_BOOL availabilityFlag[MAX_TMVP_CAND_PER_LCU]; + EB_BOOL availabilityFlag[MAX_TMVP_CAND_PER_LCU]; //*Note- list 1 motion info will be added when B-slices are ready @@ -66,12 +66,12 @@ extern EB_BOOL GetTemporalMVPBPicture( EB_U32 puWidth, EB_U32 puHeight, PictureControlSet_t *pictureControlSetPtr, - TmvpUnit_t *tmvpMapPtr, - EB_U64 colocatedPuPOC, - EB_REFLIST preDefinedColocatedPuRefList, - EB_BOOL isLowDelay, - EB_U32 tbSize, - EB_S16 *MVPCand); + TmvpUnit_t *tmvpMapPtr, + EB_U64 colocatedPuPOC, + EB_REFLIST preDefinedColocatedPuRefList, + EB_BOOL isLowDelay, + EB_U32 tbSize, + EB_S16 *MVPCand); extern EB_ERRORTYPE FillAMVPCandidates( NeighborArrayUnit_t *mvNeighborArray, @@ -87,28 +87,28 @@ extern EB_ERRORTYPE FillAMVPCandidates( EB_BOOL tmvpEnableFlag, EB_U32 tbAddr, EB_REFLIST targetRefPicList, - EB_S16 *xMvAmvpArray, - EB_S16 *yMvAmvpArray, - EB_U8 *amvpCandidateCount); + EB_S16 *xMvAmvpArray, + EB_S16 *yMvAmvpArray, + EB_U8 *amvpCandidateCount); extern EB_ERRORTYPE GenerateL0L1AmvpMergeLists( - struct ModeDecisionContext_s *contextPtr, - struct InterPredictionContext_s *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL tmvpEnableFlag, - EB_U32 tbAddr, - EB_S16 xMvAmvpArray[2][2], - EB_S16 yMvAmvpArray[2][2], - EB_U32 amvpCandidateCount[2], + struct ModeDecisionContext_s *contextPtr, + struct InterPredictionContext_s *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL tmvpEnableFlag, + EB_U32 tbAddr, + EB_S16 xMvAmvpArray[2][2], + EB_S16 yMvAmvpArray[2][2], + EB_U32 amvpCandidateCount[2], EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ); extern EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( - struct ModeDecisionContext_s *contextPtr, - struct InterPredictionContext_s *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 tbAddr); + struct ModeDecisionContext_s *contextPtr, + struct InterPredictionContext_s *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 tbAddr); #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbAvailability.c b/Source/Lib/Codec/EbAvailability.c index f84df8d15..ca98cacb9 100644 --- a/Source/Lib/Codec/EbAvailability.c +++ b/Source/Lib/Codec/EbAvailability.c @@ -12,19 +12,19 @@ EB_BOOL isBottomLeftAvailable(EB_U32 depth, { EB_BOOL availability; - EB_U32 numberOfPartitionsInWidth = 1 << depth; - EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); + EB_U32 numberOfPartitionsInWidth = 1 << depth; + EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); EB_U32 verticalPartitionIndex = (partIndex - horizontalPartitionIndex) >> depth; - + if (depth < 4) { - + availability = (EB_BOOL) ((horizontalPartitionIndex & (numberOfPartitionsInWidth - 1)) == 0); // left column border check availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x01) == 0) && (((verticalPartitionIndex) & 0x01) == 0))); // x is even and y is even availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0) && (((verticalPartitionIndex) & 0x03) == 0x01))); // x is a multiple of 4 and y mod 4 is equal to 1 availability = (EB_BOOL) (availability & (((verticalPartitionIndex != (numberOfPartitionsInWidth - 1))))); // bottom row border check } else { - + availability = (EB_BOOL) ((horizontalPartitionIndex & (numberOfPartitionsInWidth - 1)) == 0); // left column border check availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x01) == 0) && (((verticalPartitionIndex) & 0x01) == 0))); // x is even and y is even availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0) && (((verticalPartitionIndex + 1) & 0x03) != 0x00))); // x is a multiple of 4 and (y + 1) % 4 is different from 1 @@ -42,15 +42,15 @@ EB_BOOL isUpperRightAvailable( { EB_BOOL availability; - EB_U32 numberOfPartitionsInWidth = 1 << depth; - EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); + EB_U32 numberOfPartitionsInWidth = 1 << depth; + EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); EB_U32 verticalPartitionIndex = (partIndex - horizontalPartitionIndex) >> depth; - + if (depth < 4) { availability = (EB_BOOL) (horizontalPartitionIndex == (numberOfPartitionsInWidth - 1)); // right column border check availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x01) == 0x01) && (((verticalPartitionIndex) & 0x01) == 0x01))); // x is odd and y is odd - availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0x03) && (((verticalPartitionIndex) & 0x03) == 0x02))); // x mod 4 is equal to 3 and y mod 4 is equal to 2 + availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0x03) && (((verticalPartitionIndex) & 0x03) == 0x02))); // x mod 4 is equal to 3 and y mod 4 is equal to 2 availability = (EB_BOOL) (availability & (verticalPartitionIndex != 0)); // top row border check } else { @@ -63,4 +63,4 @@ EB_BOOL isUpperRightAvailable( } return (EB_BOOL)(!availability); -} \ No newline at end of file +} diff --git a/Source/Lib/Codec/EbAvailability.h b/Source/Lib/Codec/EbAvailability.h index 26ebcf4ba..ccf205e78 100644 --- a/Source/Lib/Codec/EbAvailability.h +++ b/Source/Lib/Codec/EbAvailability.h @@ -20,4 +20,4 @@ extern EB_BOOL isUpperRightAvailable( #ifdef __cplusplus } #endif -#endif // EbAvailability_h \ No newline at end of file +#endif // EbAvailability_h diff --git a/Source/Lib/Codec/EbAvcStyleMcp.c b/Source/Lib/Codec/EbAvcStyleMcp.c index 95d5f4057..f24049f3e 100644 --- a/Source/Lib/Codec/EbAvcStyleMcp.c +++ b/Source/Lib/Codec/EbAvcStyleMcp.c @@ -7,36 +7,36 @@ #include "EbPictureOperators.h" static const EB_U8 FracMappedPosTabX[16] = { 0, 1, 2, 3, - 0, 1, 2, 3, - 0, 0, 2, 0, - 0, 1, 2, 3 }; - + 0, 1, 2, 3, + 0, 0, 2, 0, + 0, 1, 2, 3 }; + static const EB_U8 FracMappedPosTabY[16] = { 0, 0, 0, 0, - 1, 0, 0, 0, - 2, 2, 2, 2, - 3, 0, 0, 0 }; - + 1, 0, 0, 0, + 2, 2, 2, 2, + 3, 0, 0, 0 }; + static const EB_U8 IntegerPosoffsetTabX[16] = { 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 0, 0, 0 }; - + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 0, 0, 0 }; + static const EB_U8 IntegerPosoffsetTabY[16] = { 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 1, 1, 1 }; + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 1, 1, 1 }; -void UnpackUniPredRef10Bit( - EbPictureBufferDesc_t *refFramePicList0, +void UnpackUniPredRef10Bit( + EbPictureBufferDesc_t *refFramePicList0, EB_U32 posX, EB_U32 posY, EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf) @@ -45,7 +45,7 @@ void UnpackUniPredRef10Bit( EB_U32 chromaPuHeight = puHeight >> 1; //doing the luma interpolation - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { (void) tempBuf; EB_U32 inPosx = (posX >> 2); @@ -72,23 +72,23 @@ void UnpackUniPredRef10Bit( EB_U32 inPosx = (posX >> 3); EB_U32 inPosy = (posY >> 3); EB_U16 *ptr16 = (EB_U16 *)refFramePicList0->bufferCb + inPosx + inPosy*refFramePicList0->strideCb; - + extract8Bitdata( ptr16, refFramePicList0->strideCb, dst->bufferCb + dstChromaIndex, - dst->strideCb, + dst->strideCb, chromaPuWidth, chromaPuHeight ); ptr16 = (EB_U16 *)refFramePicList0->bufferCr + inPosx + inPosy*refFramePicList0->strideCr; - + extract8Bitdata( ptr16, refFramePicList0->strideCr, dst->bufferCr + dstChromaIndex, - dst->strideCr, + dst->strideCr, chromaPuWidth, chromaPuHeight ); @@ -99,7 +99,7 @@ void UnpackUniPredRef10Bit( } -void UnpackBiPredRef10Bit( +void UnpackBiPredRef10Bit( EbPictureBufferDesc_t *refFramePicList0, EbPictureBufferDesc_t *refFramePicList1, EB_U32 refList0PosX, @@ -109,9 +109,9 @@ void UnpackBiPredRef10Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst) @@ -119,7 +119,7 @@ void UnpackBiPredRef10Bit( EB_U32 chromaPuWidth = puWidth >> 1; EB_U32 chromaPuHeight = puHeight >> 1; - //Luma + //Luma if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { (void) firstPassIFTempDst; @@ -127,29 +127,29 @@ void UnpackBiPredRef10Bit( (void) refList1TempDst; UnpackL0L1AvgSafeSub( (EB_U16 *)refFramePicList0->bufferY + (refList0PosX >> 2) + (refList0PosY >> 2)*refFramePicList0->strideY, - refFramePicList0->strideY, + refFramePicList0->strideY, (EB_U16 *)refFramePicList1->bufferY + (refList1PosX >> 2) + (refList1PosY >> 2)*refFramePicList1->strideY, - refFramePicList1->strideY, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, + refFramePicList1->strideY, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, puHeight ); - } + } - //uni-prediction List0 chroma + //uni-prediction List0 chroma if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { UnpackL0L1Avg( (EB_U16 *)refFramePicList0->bufferCb + (refList0PosX >> 3) + (refList0PosY >> 3)*refFramePicList0->strideCb, - refFramePicList0->strideCb, + refFramePicList0->strideCb, (EB_U16 *)refFramePicList1->bufferCb + (refList1PosX >> 3) + (refList1PosY >> 3)*refFramePicList1->strideCb, - refFramePicList1->strideCb, + refFramePicList1->strideCb, biDst->bufferCb + dstChromaIndex, - biDst->strideCb , + biDst->strideCb , chromaPuWidth, chromaPuHeight ); @@ -157,11 +157,11 @@ void UnpackBiPredRef10Bit( UnpackL0L1Avg( (EB_U16 *)refFramePicList0->bufferCr + (refList0PosX >> 3) + (refList0PosY >> 3)*refFramePicList0->strideCr, - refFramePicList0->strideCr, + refFramePicList0->strideCr, (EB_U16 *)refFramePicList1->bufferCr + (refList1PosX >> 3) + (refList1PosY >> 3)*refFramePicList1->strideCr, - refFramePicList1->strideCr, + refFramePicList1->strideCr, biDst->bufferCr + dstChromaIndex, - biDst->strideCr, + biDst->strideCr, chromaPuWidth, chromaPuHeight ); @@ -176,7 +176,7 @@ void UniPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf) @@ -189,7 +189,7 @@ void UniPredIFreeRef8Bit( EB_U32 chromaPuWidth = puWidth >> 1; EB_U32 chromaPuHeight = puHeight >> 1; - EB_U8 fracPos; + EB_U8 fracPos; lumaStride = dst->strideY; @@ -197,28 +197,28 @@ void UniPredIFreeRef8Bit( //compute the luma fractional position integPosx = (posX >> 2); integPosy = (posY >> 2); - + fracPosx = posX & 0x03; fracPosy = posY & 0x03; - + //New Interpolation Mapping mappedFracPosx = fracPosx; mappedFracPosy = fracPosy; - fracPos = (mappedFracPosx + (mappedFracPosy << 2)); - mappedFracPosx = FracMappedPosTabX[fracPos]; - mappedFracPosy = FracMappedPosTabY[fracPos]; - integPosx += IntegerPosoffsetTabX[fracPos]; - integPosy += IntegerPosoffsetTabY[fracPos]; - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) + fracPos = (mappedFracPosx + (mappedFracPosy << 2)); + mappedFracPosx = FracMappedPosTabX[fracPos]; + mappedFracPosy = FracMappedPosTabY[fracPos]; + integPosx += IntegerPosoffsetTabX[fracPos]; + integPosy += IntegerPosoffsetTabY[fracPos]; + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - //doing the luma interpolation + //doing the luma interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPic->bufferY + integPosx + integPosy*refPic->strideY, refPic->strideY, - dst->bufferY + dstLumaIndex, lumaStride, - puWidth, puHeight, - tempBuf, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); + refPic->bufferY + integPosx + integPosy*refPic->strideY, refPic->strideY, + dst->bufferY + dstLumaIndex, lumaStride, + puWidth, puHeight, + tempBuf, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); } //chroma @@ -238,70 +238,70 @@ void UniPredIFreeRef8Bit( if (fracPosy > 4){ integPosy++; } - - // Note: chromaPuWidth equals 4 is only supported in Intrinsic - // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) - //doing the chroma Cb interpolation + + // Note: chromaPuWidth equals 4 is only supported in Intrinsic + // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) + //doing the chroma Cb interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPic->bufferCb + integPosx + integPosy*refPic->strideCb, - refPic->strideCb, - dst->bufferCb + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - //doing the chroma Cr interpolation + refPic->bufferCb + integPosx + integPosy*refPic->strideCb, + refPic->strideCb, + dst->bufferCb + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + //doing the chroma Cr interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPic->bufferCr + integPosx + integPosy*refPic->strideCr, - refPic->strideCr, - dst->bufferCr + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); + refPic->bufferCr + integPosx + integPosy*refPic->strideCr, + refPic->strideCr, + dst->bufferCr + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); } } void BiPredAverageKernel_C( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight - ) + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight + ) { - EB_U32 i, j; + EB_U32 i, j; + + + for (j = 0; j < areaHeight; j++) + { + for (i = 0; i < areaWidth; i++) + { + dst[i + j * dstStride] = (src0[i + j * src0Stride] + src1[i + j * src1Stride] + 1) / 2; + } + } - - for (j = 0; j < areaHeight; j++) - { - for (i = 0; i < areaWidth; i++) - { - dst[i + j * dstStride] = (src0[i + j * src0Stride] + src1[i + j * src1Stride] + 1) / 2; - } - } - } typedef void(*EB_BIAVG_FUNC)( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); /***************************** @@ -309,9 +309,9 @@ typedef void(*EB_BIAVG_FUNC)( *****************************/ static EB_BIAVG_FUNC FUNC_TABLE BiPredAverageKernel_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - BiPredAverageKernel_C, + BiPredAverageKernel_C, #ifndef NON_AVX512_SUPPORT - BiPredAverageKernel_AVX512_INTRIN + BiPredAverageKernel_AVX512_INTRIN #else BiPredAverageKernel_AVX2_INTRIN #endif @@ -328,9 +328,9 @@ void BiPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst) @@ -339,7 +339,7 @@ void BiPredIFreeRef8Bit( EB_U32 integPosy; EB_U8 fracPosx,mappedFracPosx; EB_U8 fracPosy,mappedFracPosy; - EB_U8 fracPos; + EB_U8 fracPos; EB_U32 lumaStride, refLumaStride; @@ -347,314 +347,314 @@ void BiPredIFreeRef8Bit( EB_U32 chromaPuHeight = puHeight >> 1; lumaStride = biDst->strideY; refLumaStride = refPicList0->strideY; - EB_U8 shift = 0; + EB_U8 shift = 0; - //Luma + //Luma if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0, fracPosL1; - //uni-prediction List0 luma - //compute the luma fractional position - integPosL0x = (refList0PosX >> 2); - integPosL0y = (refList0PosY >> 2); + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0, fracPosL1; + //uni-prediction List0 luma + //compute the luma fractional position + integPosL0x = (refList0PosX >> 2); + integPosL0y = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; - fracPosL0 = (mappedFracPosx + (mappedFracPosy << 2)); + fracPosL0 = (mappedFracPosx + (mappedFracPosy << 2)); - //uni-prediction List1 luma - //compute the luma fractional position - integPosL1x = (refList1PosX >> 2); - integPosL1y = (refList1PosY >> 2); + //uni-prediction List1 luma + //compute the luma fractional position + integPosL1x = (refList1PosX >> 2); + integPosL1y = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; - fracPosL1 = (mappedFracPosx + (mappedFracPosy << 2)); + fracPosL1 = (mappedFracPosx + (mappedFracPosy << 2)); - if ( (fracPosL0 == 0) && (fracPosL1 == 0) ) - { + if ( (fracPosL0 == 0) && (fracPosL1 == 0) ) + { #ifndef NON_AVX512_SUPPORT - BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK) ]( + BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK) ]( #else BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - refPicList0->bufferY + integPosL0x + integPosL0y * refLumaStride, - refLumaStride, - refPicList1->bufferY + integPosL1x + integPosL1y * refLumaStride, - refLumaStride, - biDst->bufferY + dstLumaIndex, - lumaStride, - puWidth, - puHeight); - } - else - { - //uni-prediction List0 luma - //compute the luma fractional position - integPosx = (refList0PosX >> 2); - integPosy = (refList0PosY >> 2); - - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; - - fracPos = (mappedFracPosx + (mappedFracPosy << 2)); - mappedFracPosx = FracMappedPosTabX[fracPos]; - mappedFracPosy = FracMappedPosTabY[fracPos]; - integPosx += IntegerPosoffsetTabX[fracPos]; - integPosy += IntegerPosoffsetTabY[fracPos]; + refPicList0->bufferY + integPosL0x + integPosL0y * refLumaStride, + refLumaStride, + refPicList1->bufferY + integPosL1x + integPosL1y * refLumaStride, + refLumaStride, + biDst->bufferY + dstLumaIndex, + lumaStride, + puWidth, + puHeight); + } + else + { + //uni-prediction List0 luma + //compute the luma fractional position + integPosx = (refList0PosX >> 2); + integPosy = (refList0PosY >> 2); + + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; + + fracPos = (mappedFracPosx + (mappedFracPosy << 2)); + mappedFracPosx = FracMappedPosTabX[fracPos]; + mappedFracPosy = FracMappedPosTabY[fracPos]; + integPosx += IntegerPosoffsetTabX[fracPos]; + integPosy += IntegerPosoffsetTabY[fracPos]; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList0->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, - refList0TempDst, puWidth, - puWidth, puHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - //uni-prediction List1 luma - //compute the luma fractional position - integPosx = (refList1PosX >> 2); - integPosy = (refList1PosY >> 2); - - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; - - fracPos = (mappedFracPosx + (mappedFracPosy << 2)); - mappedFracPosx = FracMappedPosTabX[fracPos]; - mappedFracPosy = FracMappedPosTabY[fracPos]; - integPosx += IntegerPosoffsetTabX[fracPos]; - integPosy += IntegerPosoffsetTabY[fracPos]; - - //doing the luma interpolation + refPicList0->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, + refList0TempDst, puWidth, + puWidth, puHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + //uni-prediction List1 luma + //compute the luma fractional position + integPosx = (refList1PosX >> 2); + integPosy = (refList1PosY >> 2); + + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; + + fracPos = (mappedFracPosx + (mappedFracPosy << 2)); + mappedFracPosx = FracMappedPosTabX[fracPos]; + mappedFracPosy = FracMappedPosTabY[fracPos]; + integPosx += IntegerPosoffsetTabX[fracPos]; + integPosy += IntegerPosoffsetTabY[fracPos]; + + //doing the luma interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList1->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, - refList1TempDst, puWidth, - puWidth, puHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); + refPicList1->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, + refList1TempDst, puWidth, + puWidth, puHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); - // bi-pred luma - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)](refList0TempDst, puWidth , refList1TempDst, puWidth , biDst->bufferY + dstLumaIndex, lumaStride , puWidth, puHeight ); - } + // bi-pred luma + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)](refList0TempDst, puWidth , refList1TempDst, puWidth , biDst->bufferY + dstLumaIndex, lumaStride , puWidth, puHeight ); + } - } + } - //uni-prediction List0 chroma + //uni-prediction List0 chroma if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0, fracPosL1; - - //uni-prediction List0 luma - integPosL0x = (refList0PosX >> 3); - integPosL0y = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosL0x++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosL0y++; - - fracPosL0 = mappedFracPosx + (mappedFracPosy << 3); - - //uni-prediction List1 luma - integPosL1x = (refList1PosX >> 3); - integPosL1y = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosL1x++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosL1y++; - - fracPosL1 = mappedFracPosx + (mappedFracPosy << 3); - - shift = 0; - if ((fracPosL0 == 0) && (fracPosL1 == 0)) - { + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0, fracPosL1; + + //uni-prediction List0 luma + integPosL0x = (refList0PosX >> 3); + integPosL0y = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosL0x++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosL0y++; + + fracPosL0 = mappedFracPosx + (mappedFracPosy << 3); + + //uni-prediction List1 luma + integPosL1x = (refList1PosX >> 3); + integPosL1y = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosL1x++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosL1y++; + + fracPosL1 = mappedFracPosx + (mappedFracPosy << 3); + + shift = 0; + if ((fracPosL0 == 0) && (fracPosL1 == 0)) + { #ifndef NON_AVX512_SUPPORT BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK)]( #else BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - refPicList0->bufferCb + integPosL0x + integPosL0y * refPicList0->strideCb, - refPicList0->strideCb, - refPicList1->bufferCb + integPosL1x + integPosL1y * refPicList1->strideCb, - refPicList1->strideCb, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb << shift, - chromaPuWidth, - chromaPuHeight); + refPicList0->bufferCb + integPosL0x + integPosL0y * refPicList0->strideCb, + refPicList0->strideCb, + refPicList1->bufferCb + integPosL1x + integPosL1y * refPicList1->strideCb, + refPicList1->strideCb, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb << shift, + chromaPuWidth, + chromaPuHeight); #ifndef NON_AVX512_SUPPORT BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK)]( #else BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - refPicList0->bufferCr + integPosL0x + integPosL0y * refPicList0->strideCr, - refPicList0->strideCr, - refPicList1->bufferCr + integPosL1x + integPosL1y * refPicList1->strideCr, - refPicList1->strideCr, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr << shift, - chromaPuWidth, - chromaPuHeight); - - } - else - { - - // bi-pred chroma Cb - // Note: chromaPuWidth equals 4 is only supported in Intrinsic - // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) - //doing the chroma Cb interpolation list 0 - //compute the chroma fractional position - integPosx = (refList0PosX >> 3); - integPosy = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList0->bufferCr + integPosL0x + integPosL0y * refPicList0->strideCr, + refPicList0->strideCr, + refPicList1->bufferCr + integPosL1x + integPosL1y * refPicList1->strideCr, + refPicList1->strideCr, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr << shift, + chromaPuWidth, + chromaPuHeight); + + } + else + { + + // bi-pred chroma Cb + // Note: chromaPuWidth equals 4 is only supported in Intrinsic + // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) + //doing the chroma Cb interpolation list 0 + //compute the chroma fractional position + integPosx = (refList0PosX >> 3); + integPosy = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, - refPicList0->strideCb, - refList0TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - - //doing the chroma Cb interpolation list 1 - - integPosx = (refList1PosX >> 3); - integPosy = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, + refPicList0->strideCb, + refList0TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + + //doing the chroma Cb interpolation list 1 + + integPosx = (refList1PosX >> 3); + integPosy = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, - refPicList1->strideCb, - refList1TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - // bi-pred Chroma Cb - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( - refList0TempDst, - chromaPuWidth << shift, - refList1TempDst, - chromaPuWidth << shift, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb << shift, - chromaPuWidth, - chromaPuHeight >> shift - ); - - - // bi-pred chroma Cr - // Note: chromaPuWidth equals 4 is only supported in Intrinsic - // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) - //doing the chroma Cb interpolation list 0 - //compute the chroma fractional position - integPosx = (refList0PosX >> 3); - integPosy = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, + refPicList1->strideCb, + refList1TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + // bi-pred Chroma Cb + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( + refList0TempDst, + chromaPuWidth << shift, + refList1TempDst, + chromaPuWidth << shift, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb << shift, + chromaPuWidth, + chromaPuHeight >> shift + ); + + + // bi-pred chroma Cr + // Note: chromaPuWidth equals 4 is only supported in Intrinsic + // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) + //doing the chroma Cb interpolation list 0 + //compute the chroma fractional position + integPosx = (refList0PosX >> 3); + integPosy = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, - refPicList0->strideCr, - refList0TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - - //doing the chroma Cb interpolation list 1 - - integPosx = (refList1PosX >> 3); - integPosy = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, + refPicList0->strideCr, + refList0TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + + //doing the chroma Cb interpolation list 1 + + integPosx = (refList1PosX >> 3); + integPosy = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, - refPicList1->strideCr, - refList1TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - // bi-pred Chroma Cr - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( - refList0TempDst, - chromaPuWidth << shift, - refList1TempDst, - chromaPuWidth << shift, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr << shift, - chromaPuWidth, - chromaPuHeight >> shift - ); - } + refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, + refPicList1->strideCr, + refList1TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + // bi-pred Chroma Cr + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( + refList0TempDst, + chromaPuWidth << shift, + refList1TempDst, + chromaPuWidth << shift, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr << shift, + chromaPuWidth, + chromaPuHeight >> shift + ); + } } } diff --git a/Source/Lib/Codec/EbAvcStyleMcp.h b/Source/Lib/Codec/EbAvcStyleMcp.h index c8e71e17c..349dc70c3 100644 --- a/Source/Lib/Codec/EbAvcStyleMcp.h +++ b/Source/Lib/Codec/EbAvcStyleMcp.h @@ -27,13 +27,13 @@ extern "C" { void UnpackUniPredRef10Bit( - EbPictureBufferDesc_t *refFramePicList0, + EbPictureBufferDesc_t *refFramePicList0, EB_U32 posX, EB_U32 posY, EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf); @@ -48,9 +48,9 @@ void UnpackBiPredRef10Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst); @@ -62,7 +62,7 @@ void UniPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf); @@ -76,9 +76,9 @@ void BiPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst); @@ -127,17 +127,17 @@ static const AvcStyleInterpolationFilterNew FUNC_TABLE AvcStyleUniPredLumaIFFunc static const PictureAverage FUNC_TABLE PictureAverageArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT PictureAverageKernel, - // AVX2 - PictureAverageKernel_SSE2_INTRIN, + // AVX2 + PictureAverageKernel_SSE2_INTRIN, }; typedef void(*PictureAverage1Line)( - EB_BYTE src0, - EB_BYTE src1, - EB_BYTE dst, - EB_U32 areaWidth); + EB_BYTE src0, + EB_BYTE src1, + EB_BYTE dst, + EB_U32 areaWidth); static const PictureAverage1Line FUNC_TABLE PictureAverage1LineArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT diff --git a/Source/Lib/Codec/EbCabacContextModel.h b/Source/Lib/Codec/EbCabacContextModel.h index 60156686d..691d843cd 100644 --- a/Source/Lib/Codec/EbCabacContextModel.h +++ b/Source/Lib/Codec/EbCabacContextModel.h @@ -19,9 +19,9 @@ extern "C" { #define NUMBER_OF_SKIP_FLAG_CONTEXT_MODELS 3 // number of context models for skip flag -#define NUMBER_OF_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for merge flag +#define NUMBER_OF_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for merge flag -#define NUMBER_OF_MERGE_INDEX_CONTEXT_MODELS 1 // number of context models for merge index +#define NUMBER_OF_MERGE_INDEX_CONTEXT_MODELS 1 // number of context models for merge index #define NUMBER_OF_ALF_CTRL_FLAG_CONTEXT_MODELS 1 // number of context models for ALF control flag @@ -63,7 +63,7 @@ extern "C" { #define NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS 15 // number of context models for last significant XY flag -#define TOTAL_NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS 30 // total number of context models for luma and chroma +#define TOTAL_NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS 30 // total number of context models for luma and chroma #define NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS 16 // number of context models for coefficients greater than one for Luma @@ -85,7 +85,7 @@ extern "C" { #define NUMBER_OF_ALF_SVLC_CONTEXT_MODELS 3 // number of context models for ALF SVLC (filter coefficients) -#define NUMBER_OF_SAO_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for SAO merge flags +#define NUMBER_OF_SAO_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for SAO merge flags #define NUMBER_OF_SAO_TYPE_INDEX_CONTEXT_MODELS 1 // number of context models for AO SVLC (filter coefficients) @@ -176,7 +176,7 @@ typedef struct EpContext_s { EB_ContextModel skipFlagContextModel [NUMBER_OF_SKIP_FLAG_CONTEXT_MODELS]; //Updated in both EncPass + MD EB_ContextModel mergeFlagContextModel [NUMBER_OF_MERGE_FLAG_CONTEXT_MODELS]; //Updated in both EncPass + MD EB_ContextModel mergeIndexContextModel [NUMBER_OF_MERGE_INDEX_CONTEXT_MODELS]; //Updated in both EncPass + MD - + } EpContextModel_t; typedef struct SyntaxContextModelEncContext_s { @@ -237,4 +237,4 @@ extern EB_ERRORTYPE EncodeCabacContextModelCtor( #ifdef __cplusplus } #endif -#endif //EbCabacContextModel_h \ No newline at end of file +#endif //EbCabacContextModel_h diff --git a/Source/Lib/Codec/EbCodingLoop.h b/Source/Lib/Codec/EbCodingLoop.h index fc85107cb..2c89b91bc 100644 --- a/Source/Lib/Codec/EbCodingLoop.h +++ b/Source/Lib/Codec/EbCodingLoop.h @@ -15,23 +15,23 @@ extern "C" { #endif /******************************************* - * ModeDecisionLCU + * ModeDecisionLCU * performs CL (LCU) *******************************************/ typedef EB_ERRORTYPE(*EB_MODE_DECISION)( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, const MdcLcuData_t * const mdcResultTbPtr, LargestCodingUnit_t *lcuPtr, EB_U32 lcuOriginX, EB_U32 lcuOriginY, - EB_U32 lcuAddr, + EB_U32 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE ModeDecisionLcu( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, const MdcLcuData_t * const mdcResultTbPtr, LargestCodingUnit_t *lcuPtr, EB_U16 lcuOriginX, @@ -40,39 +40,39 @@ extern EB_ERRORTYPE ModeDecisionLcu( ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE BdpConfiguration( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, LargestCodingUnit_t *lcuPtr, LcuParams_t *lcuParamPtr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE BdpPillar( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE BdpMvMergePass( - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); @@ -88,22 +88,22 @@ extern EB_ERRORTYPE LinkBdptoMd( extern EB_ERRORTYPE ModeDecisionRefinementLcu( - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, EB_U32 lcuOriginX, EB_U32 lcuOriginY, - ModeDecisionContext_t *contextPtr); + ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE QpmDeriveWeightsMinAndMax( - PictureControlSet_t *pictureControlSetPtr, - EncDecContext_t *contextPtr); + PictureControlSet_t *pictureControlSetPtr, + EncDecContext_t *contextPtr); extern void EncodePass( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, LargestCodingUnit_t *lcuPtr, EB_U32 tbAddr, - EB_U32 lcuOriginX, + EB_U32 lcuOriginX, EB_U32 lcuOriginY, EB_U32 lcuQp, EB_BOOL enableSaoFlag, diff --git a/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c b/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c index e7acfdd74..86d4ecc83 100644 --- a/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c +++ b/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c @@ -42,12 +42,12 @@ static const EB_U8 CabacEstimatedBitsV2[] = static EB_U32 EncodeLastSignificantXYTemp( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 lastSigXPos, - EB_U32 lastSigYPos, - const EB_U32 size, - const EB_U32 isChroma) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 lastSigXPos, + EB_U32 lastSigYPos, + const EB_U32 size, + const EB_U32 isChroma) { EB_U32 coeffBits = 0; @@ -81,29 +81,29 @@ static EB_U32 EncodeLastSignificantXTemp( EB_S32 shift; EB_U32 contextIndex; EB_S32 groupCount; - + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize-2)*3 + ((logBlockSize-1)>>2)); shift = isChroma ? (logBlockSize-2) : ((logBlockSize+1)>>2); - + // X position xGroupIndex = lastSigXYGroupIndex[ lastSigXPos ]; - + for (contextIndex = 0; contextIndex < xGroupIndex; contextIndex++) { coeffBits += CabacEstimatedBitsV2[ 1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (xGroupIndex < lastSigXYGroupIndex[ size - 1 ]) { coeffBits += CabacEstimatedBitsV2[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (xGroupIndex > 3) { groupCount = (xGroupIndex - 2 ) >> 1; coeffBits += groupCount * ONE_BIT; } - + return coeffBits; } @@ -120,29 +120,29 @@ static EB_U32 EncodeLastSignificantYTemp( EB_S32 shift; EB_U32 contextIndex; EB_S32 groupCount; - + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize-2)*3 + ((logBlockSize-1)>>2)); shift = isChroma ? (logBlockSize-2) : ((logBlockSize+1)>>2); - + // Y position yGroupIndex = lastSigXYGroupIndex[ lastSigYPos ]; - + for (contextIndex = 0; contextIndex < yGroupIndex; contextIndex++) { coeffBits += CabacEstimatedBitsV2[ 1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (yGroupIndex < lastSigXYGroupIndex[ size - 1 ]) { coeffBits += CabacEstimatedBitsV2[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (yGroupIndex > 3) { groupCount = (yGroupIndex - 2 ) >> 1; coeffBits += groupCount * ONE_BIT; } - + return coeffBits; } @@ -171,7 +171,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsLast[120+2*i] = EncodeLastSignificantXTemp(cabacEncodeCtxPtr, i, 4, 2, 1); CabacCostPtr->CabacBitsLast[121+2*i] = EncodeLastSignificantYTemp(cabacEncodeCtxPtr, i, 4, 2, 1); } - + for (i = 0; i < 8; i++) { CabacCostPtr->CabacBitsLast[8+2*i] = EncodeLastSignificantXTemp(cabacEncodeCtxPtr, i, 8, 3, 0); @@ -237,7 +237,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, for (i = 0; i < 3; i++) { EB_S32 j; - + for (j = 0; j < 16; j++) { CabacCostPtr->CabacBitsSigV[2*i+0][j] = CabacCostPtr->CabacBitsSig[1+2*contextIndexMap4[i][j]]; @@ -246,7 +246,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsSigV[2*i+7][j] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap4[i][j]+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; } } - + for (i = 0; i < 16; i++) { // Index: diag 0 / non diag 1 : context, always 0 : pos @@ -262,7 +262,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsSigV[20+1][i] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap8[1][0][i]+2*15]; CabacCostPtr->CabacBitsSigV[22+0][i] = CabacCostPtr->CabacBitsSig[1+2*contextIndexMap8[1][0][i]+2*18]; CabacCostPtr->CabacBitsSigV[22+1][i] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap8[1][0][i]+2*18]; - + CabacCostPtr->CabacBitsSigV[24+0][i] = CabacCostPtr->CabacBitsSig[1+2*contextIndexMap8[0][0][i]+2*9+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[24+1][i] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap8[0][0][i]+2*9+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[26+0][i] = CabacCostPtr->CabacBitsSigV[24+0][i]; @@ -281,14 +281,14 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsSigV[16+1][i] = CabacCostPtr->CabacBitsSig[0+2*0]; CabacCostPtr->CabacBitsSigV[20+0][i] = CabacCostPtr->CabacBitsSig[1+2*0]; CabacCostPtr->CabacBitsSigV[20+1][i] = CabacCostPtr->CabacBitsSig[0+2*0]; - + CabacCostPtr->CabacBitsSigV[24+0][i] = CabacCostPtr->CabacBitsSig[1+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[24+1][i] = CabacCostPtr->CabacBitsSig[0+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[28+0][i] = CabacCostPtr->CabacBitsSig[1+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[28+1][i] = CabacCostPtr->CabacBitsSig[0+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; } } - + for (i = 0; i < 32; i += 2) { EB_S32 j; @@ -310,7 +310,7 @@ static EB_U32 RemainingCoeffExponentialGolombCodeTemp(EB_U32 symbolValue, EB_U32 { EB_S32 codeWord = symbolValue >> golombParam; EB_U32 numberOfBins; - + numberOfBins = golombParam + 1; if (codeWord < COEF_REMAIN_BIN_REDUCTION) { @@ -321,7 +321,7 @@ static EB_U32 RemainingCoeffExponentialGolombCodeTemp(EB_U32 symbolValue, EB_U32 codeWord -= COEF_REMAIN_BIN_REDUCTION - 1; numberOfBins += 2 * Log2f(codeWord) + COEF_REMAIN_BIN_REDUCTION; } - + return ONE_BIT * numberOfBins; } @@ -332,623 +332,623 @@ static const EB_U8 g_mask[32] = { static inline EB_U32 RemainingCoeffExponentialGolombCodeTempZeroParam(EB_U32 symbolValue) { - EB_S32 codeWord = symbolValue; - EB_U32 numberOfBins; - - numberOfBins = 1; - if (codeWord < COEF_REMAIN_BIN_REDUCTION) - { - numberOfBins += codeWord; - } - else - { - codeWord -= COEF_REMAIN_BIN_REDUCTION - 1; - numberOfBins += 2 * Log2f(codeWord) + COEF_REMAIN_BIN_REDUCTION; - } - - return ONE_BIT * numberOfBins; + EB_S32 codeWord = symbolValue; + EB_U32 numberOfBins; + + numberOfBins = 1; + if (codeWord < COEF_REMAIN_BIN_REDUCTION) + { + numberOfBins += codeWord; + } + else + { + codeWord -= COEF_REMAIN_BIN_REDUCTION - 1; + numberOfBins += 2 * Log2f(codeWord) + COEF_REMAIN_BIN_REDUCTION; + } + + return ONE_BIT * numberOfBins; } EB_ERRORTYPE PmEstimateQuantCoeffLuma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 coeffBits = 0; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_U32 posLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - - __m128i sigBits = _mm_setzero_si128(); - __m128i cs0, cs1; - __m128i z0 = _mm_setzero_si128(); - __m128i *sigBitsPtr; - - (void)(cabacEncodeCtxPtr); - (void)(type); - (void)(intraLumaMode); - (void)(intraChromaMode); - (void)componentType; - (void)size; - // Coefficients ordered according to scan order (absolute values) + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 coeffBits = 0; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_U32 posLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; + + + __m128i sigBits = _mm_setzero_si128(); + __m128i cs0, cs1; + __m128i z0 = _mm_setzero_si128(); + __m128i *sigBitsPtr; + + (void)(cabacEncodeCtxPtr); + (void)(type); + (void)(intraLumaMode); + (void)(intraChromaMode); + (void)componentType; + (void)size; + // Coefficients ordered according to scan order (absolute values) __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16))] = {{0}}; - EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; - EB_U16 greaterThan1Map; + EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; + EB_U16 greaterThan1Map; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 absVal; - EB_U32 symbolValue; + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 absVal; + EB_U32 symbolValue; - coeffBits += CabacCost->CabacBitsLast[0]; - coeffBits += CabacCost->CabacBitsLast[1]; + coeffBits += CabacCost->CabacBitsLast[0]; + coeffBits += CabacCost->CabacBitsLast[1]; - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; - coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; + coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[symbolValue]; + // Add bits for coeff_abs_level_greater2_flag + coeffBits += CabacCost->CabacBitsG2[symbolValue]; - if (symbolValue) - { - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + if (symbolValue) + { + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } - } + } + } - coeffBits += ONE_BIT; // Sign bit + coeffBits += ONE_BIT; // Sign bit - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; - } + return return_error; + } - //------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------- - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - EB_S32 sigmap; + EB_S32 sigmap; - { + { - __m128i z1; - __m128i a0, a1, a2, a3; - __m128i b0, b1, c0, c1, d0, d1; - __m128i s0, s1; + __m128i z1; + __m128i a0, a1, a2, a3; + __m128i b0, b1, c0, c1, d0, d1; + __m128i s0, s1; - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; - // determine position of subblock within transform block - subblockPtr = coeffBufferPtr; + // determine position of subblock within transform block + subblockPtr = coeffBufferPtr; - a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- - a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- - a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- - a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- + a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- + a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- + a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - { - EB_S32 v03, v30; + { + EB_S32 v03, v30; - b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 - b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 + b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 - c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 + c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - v03 = _mm_extract_epi16(a0, 3); - v30 = _mm_extract_epi16(a3, 0); + v03 = _mm_extract_epi16(a0, 3); + v30 = _mm_extract_epi16(a3, 0); - d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 - d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 + d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 - d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 - } + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 + d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 + } - //CHKN: use abs - // Absolute value (note: _mm_abs_epi16 requires SSSE3) - s0 = _mm_srai_epi16(d0, 15); - s1 = _mm_srai_epi16(d1, 15); - d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); - d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); + //CHKN: use abs + // Absolute value (note: _mm_abs_epi16 requires SSSE3) + s0 = _mm_srai_epi16(d0, 15); + s1 = _mm_srai_epi16(d1, 15); + d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); + d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); - z0 = _mm_packs_epi16(d0, d1); - z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); - z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); + z0 = _mm_packs_epi16(d0, d1); + z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); + z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - sigmap = _mm_movemask_epi8(z0) ^ 0xffff; + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; - linearCoeff[0] = d0; - linearCoeff[1] = d1; + linearCoeff[0] = d0; + linearCoeff[1] = d1; - greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); + greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); - } + } - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost - // subblock position + // subblock position - posLast = Log2f(sigmap); + posLast = Log2f(sigmap); - coeffGroupPosition = scans4[0][posLast]; + coeffGroupPosition = scans4[0][posLast]; - lastSigYPos = coeffGroupPosition >> 2; - lastSigXPos = coeffGroupPosition & 3; + lastSigYPos = coeffGroupPosition >> 2; + lastSigXPos = coeffGroupPosition & 3; - // Add cost of significance map - sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[0]; - cs0 = _mm_loadu_si128(sigBitsPtr); - cs1 = _mm_loadu_si128(sigBitsPtr + 1); - cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); + // Add cost of significance map + sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[0]; + cs0 = _mm_loadu_si128(sigBitsPtr); + cs1 = _mm_loadu_si128(sigBitsPtr + 1); + cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); - // Set bit count to zero for positions that are not coded - cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); + // Set bit count to zero for positions that are not coded + cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); - sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); - // Add significance bits - sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 - coeffBits += _mm_cvtsi128_si32(sigBits); + sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); + // Add significance bits + sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 + coeffBits += _mm_cvtsi128_si32(sigBits); - // Encode the position of last significant coefficient - coeffBits += CabacCost->CabacBitsLast[2 * lastSigXPos + 0]; - coeffBits += CabacCost->CabacBitsLast[2 * lastSigYPos + 1]; + // Encode the position of last significant coefficient + coeffBits += CabacCost->CabacBitsLast[2 * lastSigXPos + 0]; + coeffBits += CabacCost->CabacBitsLast[2 * lastSigYPos + 1]; - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - subSetIndex = 0; - do - { + subSetIndex = 0; + do + { - EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_S32 index; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 index; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); - coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) + coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) - if (greaterThan1Map == 0) - { - coeffBits += CabacCost->CabacBitsG1x[numNonZeroCoeffs - 1]; - continue; - } + if (greaterThan1Map == 0) + { + coeffBits += CabacCost->CabacBitsG1x[numNonZeroCoeffs - 1]; + continue; + } - sigmap = sigmap << 16; + sigmap = sigmap << 16; - EB_S32 subPosition = 15; + EB_S32 subPosition = 15; - EB_U32 count = 0; - do - { - if (sigmap < 0) - { - absCoeff[count++] = linearCoeffBufferPtr[subPosition]; - } - subPosition--; - sigmap <<= 1; - } while (sigmap); + EB_U32 count = 0; + do + { + if (sigmap < 0) + { + absCoeff[count++] = linearCoeffBufferPtr[subPosition]; + } + subPosition--; + sigmap <<= 1; + } while (sigmap); - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for coeff_abs_level_greater1_flag + // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag + // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[symbolValue]; + coeffBits += CabacCost->CabacBitsG2[symbolValue]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } + } - index++; + index++; - // Exit loop early as remaining coefficients are coded differently - break; - } + // Exit loop early as remaining coefficients are coded differently + break; + } - } + } - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for >1 flag + // Add bits for >1 flag - coeffBits += CabacCost->CabacBitsG1[symbolValue]; + coeffBits += CabacCost->CabacBitsG1[symbolValue]; - if (symbolValue) - { - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); - } - } + if (symbolValue) + { + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); + } + } - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < (EB_S32)numNonZeroCoeffs; index++) - { - EB_S32 absVal = absCoeff[index]; + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < (EB_S32)numNonZeroCoeffs; index++) + { + EB_S32 absVal = absCoeff[index]; - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); - } + } - } while (--subSetIndex >= 0); + } while (--subSetIndex >= 0); - // Add local bit counter to global bit counter + // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; + return return_error; } EB_ERRORTYPE PmEstimateQuantCoeffChroma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 coeffBits = 0; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_U32 posLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - (void)(cabacEncodeCtxPtr); - (void)(type); - (void)(intraLumaMode); - (void)(intraChromaMode); - (void)componentType; - (void)size; - __m128i sigBits = _mm_setzero_si128(); - __m128i cs0, cs1; - __m128i z0 = _mm_setzero_si128(); - //EB_S32 sigCtx = 0; - - __m128i *sigBitsPtr; - - - // Coefficients ordered according to scan order (absolute values) + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 coeffBits = 0; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_U32 posLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; + + (void)(cabacEncodeCtxPtr); + (void)(type); + (void)(intraLumaMode); + (void)(intraChromaMode); + (void)componentType; + (void)size; + __m128i sigBits = _mm_setzero_si128(); + __m128i cs0, cs1; + __m128i z0 = _mm_setzero_si128(); + //EB_S32 sigCtx = 0; + + __m128i *sigBitsPtr; + + + // Coefficients ordered according to scan order (absolute values) __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16))] = {{0}}; - EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; + EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; - EB_U16 greaterThan1Map; + EB_U16 greaterThan1Map; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 absVal; - EB_U32 symbolValue; + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 absVal; + EB_U32 symbolValue; - coeffBits += CabacCost->CabacBitsLast[120 + 0]; - coeffBits += CabacCost->CabacBitsLast[120 + 1]; + coeffBits += CabacCost->CabacBitsLast[120 + 0]; + coeffBits += CabacCost->CabacBitsLast[120 + 1]; - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; - coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag + // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; + coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } - } + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + } + } - coeffBits += ONE_BIT; // Sign bit - // Add local bit counter to global bit counter + coeffBits += ONE_BIT; // Sign bit + // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; - } + return return_error; + } - //sigCtx = 0; - //if (isChroma) - // sigCtx += 6; + //sigCtx = 0; + //if (isChroma) + // sigCtx += 6; - //------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------- - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - EB_S32 sigmap; + EB_S32 sigmap; - { + { - __m128i z1; - // __m128i z2; - __m128i a0, a1, a2, a3; - __m128i b0, b1, c0, c1, d0, d1; - __m128i s0, s1; + __m128i z1; + // __m128i z2; + __m128i a0, a1, a2, a3; + __m128i b0, b1, c0, c1, d0, d1; + __m128i s0, s1; - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; - // determine position of subblock within transform block - subblockPtr = coeffBufferPtr; + // determine position of subblock within transform block + subblockPtr = coeffBufferPtr; - a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- - a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- - a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- - a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- + a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- + a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- + a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - { - EB_S32 v03, v30; + { + EB_S32 v03, v30; - b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 - b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 + b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 - c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 + c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - v03 = _mm_extract_epi16(a0, 3); - v30 = _mm_extract_epi16(a3, 0); + v03 = _mm_extract_epi16(a0, 3); + v30 = _mm_extract_epi16(a3, 0); - d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 - d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 + d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 - d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 - } + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 + d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 + } - //CHKN: use abs - // Absolute value (note: _mm_abs_epi16 requires SSSE3) - s0 = _mm_srai_epi16(d0, 15); - s1 = _mm_srai_epi16(d1, 15); - d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); - d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); + //CHKN: use abs + // Absolute value (note: _mm_abs_epi16 requires SSSE3) + s0 = _mm_srai_epi16(d0, 15); + s1 = _mm_srai_epi16(d1, 15); + d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); + d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); - z0 = _mm_packs_epi16(d0, d1); - z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); - z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); + z0 = _mm_packs_epi16(d0, d1); + z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); + z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - sigmap = _mm_movemask_epi8(z0) ^ 0xffff; + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; - linearCoeff[0] = d0; - linearCoeff[1] = d1; + linearCoeff[0] = d0; + linearCoeff[1] = d1; - greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); + greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); - } + } - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost - // subblock position + // subblock position - posLast = Log2f(sigmap); + posLast = Log2f(sigmap); - coeffGroupPosition = scans4[0][posLast]; + coeffGroupPosition = scans4[0][posLast]; - lastSigYPos = coeffGroupPosition >> 2; - lastSigXPos = coeffGroupPosition & 3; + lastSigYPos = coeffGroupPosition >> 2; + lastSigXPos = coeffGroupPosition & 3; - // Add cost of significance map - sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[6]; - cs0 = _mm_loadu_si128(sigBitsPtr); - cs1 = _mm_loadu_si128(sigBitsPtr + 1); - cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); + // Add cost of significance map + sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[6]; + cs0 = _mm_loadu_si128(sigBitsPtr); + cs1 = _mm_loadu_si128(sigBitsPtr + 1); + cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); - // Set bit count to zero for positions that are not coded - cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); + // Set bit count to zero for positions that are not coded + cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); - sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); - // Add significance bits - sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 - coeffBits += _mm_cvtsi128_si32(sigBits); + sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); + // Add significance bits + sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 + coeffBits += _mm_cvtsi128_si32(sigBits); - // Encode the position of last significant coefficient + // Encode the position of last significant coefficient - coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigXPos]; - coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigYPos + 1]; + coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigXPos]; + coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigYPos + 1]; - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - subSetIndex = 0; - do - { + subSetIndex = 0; + do + { - EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_S32 index; - // EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 index; + // EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); - coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) + coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) - if (greaterThan1Map == 0) - { - coeffBits += CabacCost->CabacBitsG1x[4 * 16 + numNonZeroCoeffs - 1]; - continue; - } + if (greaterThan1Map == 0) + { + coeffBits += CabacCost->CabacBitsG1x[4 * 16 + numNonZeroCoeffs - 1]; + continue; + } - sigmap = sigmap << 16; + sigmap = sigmap << 16; - EB_S32 subPosition = 15; + EB_S32 subPosition = 15; - EB_U32 count = 0; - do - { - if (sigmap < 0) - { - absCoeff[count++] = linearCoeffBufferPtr[subPosition]; - } - subPosition--; - sigmap <<= 1; - } while (sigmap); + EB_U32 count = 0; + do + { + if (sigmap < 0) + { + absCoeff[count++] = linearCoeffBufferPtr[subPosition]; + } + subPosition--; + sigmap <<= 1; + } while (sigmap); - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for coeff_abs_level_greater1_flag + // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag + // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; + coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } + } - index++; + index++; - // Exit loop early as remaining coefficients are coded differently - break; - } + // Exit loop early as remaining coefficients are coded differently + break; + } - } + } - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for >1 flag + // Add bits for >1 flag - coeffBits += CabacCost->CabacBitsG1[2 * 16 + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 * 16 + symbolValue]; - if (symbolValue) - { - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); + if (symbolValue) + { + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); - } - } + } + } - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < (EB_S32)numNonZeroCoeffs; index++) - { - EB_S32 absVal = absCoeff[index]; - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < (EB_S32)numNonZeroCoeffs; index++) + { + EB_S32 absVal = absCoeff[index]; + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); - } + } - } while (--subSetIndex >= 0); + } while (--subSetIndex >= 0); - // Add local bit counter to global bit counter + // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; + return return_error; } /********************************************************************** @@ -956,21 +956,21 @@ EB_ERRORTYPE PmEstimateQuantCoeffChroma_SSE2( **********************************************************************/ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { EB_ERRORTYPE return_error = EB_ErrorNone; - + EB_S32 isChroma = componentType != COMPONENT_LUMA; EB_U32 logBlockSize = Log2f(size); EB_U32 coeffBits = 0; @@ -985,7 +985,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( EB_S32 lastSigXPos; EB_S32 lastSigYPos; EB_U32 contextOffset1; - + __m128i sigBits = _mm_setzero_si128(); __m128i cs0, cs1; @@ -993,12 +993,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( EB_S32 sigCtx = 0; EB_U8 nnz[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ]; __m128i *sigBitsPtr; - + // Coefficients ordered according to scan order (absolute values) __m128i linearCoeff[ MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16)) ]; EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; EB_U16 greaterThan1Map[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ] ={0}; - + // Significance map for each 4x4 subblock // 1 bit per coefficient // i-th bit corresponds to i-th coefficient in forward scan order @@ -1014,7 +1014,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( EB_U32 contextOffset2; coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, 0, 0, size, isChroma); - + absVal = ABS(coeffBufferPtr[ 0 ]); symbolValue = absVal > 1; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; @@ -1022,11 +1022,11 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( // Add bits for coeff_abs_level_greater1_flag coeffBits += CabacCost->CabacBitsG1[2*(contextOffset+1) + symbolValue]; - + if (symbolValue) { symbolValue = absVal > 2; - + // Add bits for coeff_abs_level_greater2_flag coeffBits += CabacCost->CabacBitsG2[2*(contextOffset2) + symbolValue]; if (symbolValue) @@ -1035,10 +1035,10 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 3, 0); } } - + coeffBits += ONE_BIT; // Sign bit // Add local bit counter to global bit counter - + *coeffBitsLong += coeffBits << 10; return return_error; } @@ -1046,7 +1046,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( // Compute the scanning type // optimized this if statement later - + if (type == INTRA_MODE) { // The test on partition size should be commented out to get conformance for Intra 4x4 ! @@ -1056,12 +1056,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( // the mode of upper-left corner of current CU //intraLumaMode = candidatePtr->intraLumaMode[0]; //intraChromaMode = candidatePtr->intraChromaMode[0]; - + if (logBlockSize <= (EB_U32)(3 - isChroma)) { EB_U32 tempIntraChromaMode = chromaMappingTable[ intraChromaMode ]; EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; - + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; @@ -1069,7 +1069,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } } - + if (logBlockSize == 2) { sigCtx = 2 * scanIndex; // 6 values @@ -1079,7 +1079,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { sigCtx = 12; if (isChroma) sigCtx += 12; - + if (logBlockSize != 3) { sigCtx += 4; @@ -1089,9 +1089,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( sigCtx += 8; } } - + //------------------------------------------------------------------------------------------------------------------- - + // Loop through subblocks to reorder coefficients according to scan order // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients subSetIndex = 0; @@ -1104,41 +1104,41 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( __m128i s0, s1; EB_S32 sigmap; EB_S16 *subblockPtr; - + // determine position of subblock within transform block coeffGroupPosition = sbScans[ logBlockSize-2 ][ subSetIndex ]; coeffGroupPositionY = coeffGroupPosition >> 4; coeffGroupPositionX = coeffGroupPosition & 15; - + if (scanIndex == SCAN_HOR2) { // Subblock scan is mirrored for horizontal scan SWAP(coeffGroupPositionX, coeffGroupPositionY); } - + /*EB_S16 **/subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - + if (scanIndex == SCAN_DIAG2) { EB_S32 v03, v30; - + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - + v03 = _mm_extract_epi16(a0, 3); v30 = _mm_extract_epi16(a3, 0); - + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 } @@ -1151,11 +1151,11 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { b0 = _mm_unpacklo_epi16(a0, a2); // 00 20 01 21 02 22 03 23 b1 = _mm_unpacklo_epi16(a1, a3); // 10 30 11 31 12 32 13 33 - + d0 = _mm_unpacklo_epi16(b0, b1); // 00 10 20 30 01 11 21 31 d1 = _mm_unpackhi_epi16(b0, b1); // 02 12 22 32 03 13 23 33 } - + // Absolute value (note: _mm_abs_epi16 requires SSSE3) s0 = _mm_srai_epi16(d0, 15); s1 = _mm_srai_epi16(d1, 15); @@ -1164,23 +1164,23 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( z0 = _mm_packs_epi16(d0, d1); z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; subblockSigmap[ subSetIndex ] = (EB_U16)sigmap; - + if (sigmap != 0) { EB_U32 num; - + lastScanSet = subSetIndex; linearCoeff[ 2 * subSetIndex + 0 ] = d0; linearCoeff[ 2 * subSetIndex + 1 ] = d1; - + greaterThan1Map[ subSetIndex ] = (EB_U16) _mm_movemask_epi8(z1); - + // Count number of bits set in sigmap (Hamming weight) z2 = _mm_sad_epu8(z0, _mm_setzero_si128()); - + num = 16; num += _mm_cvtsi128_si32(z2); num += _mm_extract_epi16(z2, 4); @@ -1197,7 +1197,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { nnz[subSetIndex] = 0; } - + if (sigmap != 0 || subSetIndex == 0) { // Add cost of significance map @@ -1213,13 +1213,13 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } sigCtx |= 2; // differentiate between first and other blocks because of DC subSetIndex++; - + // Check that we are not going beyond block end } //------------------------------------------------------------------------------------------------------------------- // Obtain the last significant X and Y positions and compute their bit cost - + // subblock position coeffGroupPosition = sbScans[ logBlockSize - 2 ][ lastScanSet ]; coeffGroupPositionY = coeffGroupPosition >> 4; @@ -1227,28 +1227,28 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( lastSigYPos = 4 * coeffGroupPositionY; lastSigXPos = 4 * coeffGroupPositionX; scanPosLast = 16 * lastScanSet; - + // position within subblock posLast = Log2f(subblockSigmap[ lastScanSet ]); coeffGroupPosition = scans4[ scanIndex != SCAN_DIAG2 ][ posLast ]; lastSigYPos += coeffGroupPosition >> 2; lastSigXPos += coeffGroupPosition & 3; scanPosLast += posLast; - + // Add cost of significance map sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[sigCtx]; cs0 = _mm_loadu_si128(sigBitsPtr); cs1 = _mm_loadu_si128(sigBitsPtr+1); cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); - + // Set bit count to zero for positions that are not coded cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask+16-posLast))); - + sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); // Add significance bits sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 coeffBits += _mm_cvtsi128_si32(sigBits); - + // Should swap row/col for SCAN_HOR and SCAN_VER: // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) // - SCAN_VER because of equation (7-66) in H.265 (04/2013) @@ -1257,33 +1257,33 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { SWAP(lastSigXPos, lastSigYPos); } - + // Encode the position of last significant coefficient coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, isChroma); - + //------------------------------------------------------------------------------------------------------------------- // Encode Coefficient levels - + contextOffset1 = 1; - + // Loop over subblocks subSetIndex = lastScanSet; do { EB_S32 numNonZero = 0; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) EB_U32 golombRiceParam = 0; EB_S32 index; EB_U32 contextSet; EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded EB_U32 contextOffset; EB_U32 contextOffset2; - + // 1. Subblock-level significance flag - + if (subSetIndex != 0) { - + if (subSetIndex != lastScanSet) { EB_U32 sigCoeffGroupContextIndex; @@ -1291,12 +1291,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( sigCoeffGroupContextIndex = 0; sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - + significanceFlag = (subblockSigmap[ subSetIndex ] != 0); - + // Add bits for coded_sub_block_flag coeffBits += CabacCost->CabacBitsSigMl[2*sigCoeffGroupContextIndex+significanceFlag]; - + if (!significanceFlag) { // Nothing else to do for this subblock since all coefficients in it are zero @@ -1305,21 +1305,21 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } - - + + // 3. Coefficient level values - + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - + numNonZero = nnz[ subSetIndex ]; numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } + { + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } if (greaterThan1Map[subSetIndex] == 0) { @@ -1344,7 +1344,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } while (sigMap); } - + // Loop over coefficients until base value of Exp-Golomb coding changes // Base value changes after either // - 8th coefficient @@ -1376,14 +1376,14 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } } - + // Loop over coefficients after first one that was > 1 but before 8th one // Base value is know to be equal to 2 for ( ; index < numCoeffWithCodedGt1Flag; index++) { EB_S32 absVal = absCoeff[ index ]; EB_U32 symbolValue = absVal > 1; - + // Add bits for >1 flag coeffBits += CabacCost->CabacBitsG1[2*contextOffset + symbolValue]; if (symbolValue) @@ -1392,7 +1392,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } - + // Loop over remaining coefficients (8th and beyond) // Base value is known to be equal to 1 for ( ; index < numNonZero; index++ ) @@ -1404,29 +1404,29 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } while (--subSetIndex >= 0); - + // Add local bit counter to global bit counter *coeffBitsLong += coeffBits << 10; - + return return_error; } EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { EB_ERRORTYPE return_error = EB_ErrorNone; - + EB_S32 isChroma = componentType != COMPONENT_LUMA; EB_U32 logBlockSize = Log2f(size); EB_U32 coeffBits = 0; @@ -1442,17 +1442,17 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( EB_S32 lastSigYPos; EB_U32 significantFlagContextOffset; EB_U32 contextOffset1; - + // Coefficients ordered according to scan order (absolute values) EB_U16 linearCoeff[ MAX_TU_SIZE * MAX_TU_SIZE ]; EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; EB_U16 greaterThan1Map[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ]; - + // Significance map for each 4x4 subblock // 1 bit per coefficient // i-th bit corresponds to i-th coefficient in forward scan order EB_U16 subblockSigmap[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ]; - + // DC-only fast track if (numNonZeroCoeffs == 1 && coeffBufferPtr[ 0 ] != 0) { @@ -1460,21 +1460,21 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( EB_U32 symbolValue; EB_U32 contextOffset; EB_U32 contextOffset2; - + coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, 0, 0, size, isChroma); - + absVal = ABS(coeffBufferPtr[ 0 ]); symbolValue = absVal > 1; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - + // Add bits for coeff_abs_level_greater1_flag coeffBits += CabacCost->CabacBitsG1[2*(contextOffset+1) + symbolValue]; - + if (symbolValue) { symbolValue = absVal > 2; - + // Add bits for coeff_abs_level_greater2_flag coeffBits += CabacCost->CabacBitsG2[2*(contextOffset2) + symbolValue]; @@ -1484,17 +1484,17 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 3, 0); } } - + coeffBits += ONE_BIT; // Sign bit // Add local bit counter to global bit counter - + *coeffBitsLong += coeffBits << 10; return return_error; } - + // Compute the scanning type // optimized this if statement later - + if (type == INTRA_MODE) { // The test on partition size should be commented out to get conformance for Intra 4x4 ! @@ -1504,12 +1504,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( // the mode of upper-left corner of current CU //intraLumaMode = candidatePtr->intraLumaMode[0]; //intraChromaMode = candidatePtr->intraChromaMode[0]; - + if (logBlockSize <= (EB_U32)(3 - isChroma)) { EB_U32 tempIntraChromaMode = chromaMappingTable[ intraChromaMode ]; EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; - + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; @@ -1517,15 +1517,15 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } } - + //------------------------------------------------------------------------------------------------------------------- - + // Loop through subblocks to reorder coefficients according to scan order // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients subSetIndex = 0; while (1) { - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; EB_S16 k; EB_S32 sigmap = 0; EB_U32 num = 0; @@ -1534,18 +1534,18 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( coeffGroupPosition = sbScans[ logBlockSize-2 ][ subSetIndex ]; coeffGroupPositionY = coeffGroupPosition >> 4; coeffGroupPositionX = coeffGroupPosition & 15; - + if (scanIndex == SCAN_HOR2) { // Subblock scan is mirrored for horizontal scan SWAP(coeffGroupPositionX, coeffGroupPositionY); } - + subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - + for (k = 0; k < 16; k++) { - EB_U32 val , isNonZero; + EB_U32 val , isNonZero; EB_U32 position = scans4[ scanIndex != SCAN_DIAG2 ][ k ]; EB_U32 positionY = position >> 2; EB_U32 positionX = position & 3; @@ -1554,7 +1554,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( // Subblock scan is mirrored for horizontal scan SWAP(positionX, positionY); } - + /*EB_U32*/ val = ABS(subblockPtr[ coeffStride * positionY + positionX ]); linearCoeff[ 16 * subSetIndex + k ] = (EB_U16) val; /*EB_U32 */isNonZero = val != 0; @@ -1565,29 +1565,29 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( g1map |= 1 << k; } } - + subblockSigmap[ subSetIndex ] = (EB_U16) sigmap; greaterThan1Map[ subSetIndex ] = (EB_U16) g1map; if (sigmap != 0) { lastScanSet = subSetIndex; - + numNonZeroCoeffs -= num; if (numNonZeroCoeffs == 0) { break; } } - + subSetIndex++; - + // Check that we are not going beyond block end } - + //------------------------------------------------------------------------------------------------------------------- // Obtain the last significant X and Y positions and compute their bit cost - + // subblock position coeffGroupPosition = sbScans[ logBlockSize - 2 ][ lastScanSet ]; coeffGroupPositionY = coeffGroupPosition >> 4; @@ -1595,14 +1595,14 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( lastSigYPos = 4 * coeffGroupPositionY; lastSigXPos = 4 * coeffGroupPositionX; scanPosLast = 16 * lastScanSet; - + // position within subblock posLast = Log2f(subblockSigmap[ lastScanSet ]); coeffGroupPosition = scans4[ scanIndex != SCAN_DIAG2 ][ posLast ]; lastSigYPos += coeffGroupPosition >> 2; lastSigXPos += coeffGroupPosition & 3; scanPosLast += posLast; - + // Should swap row/col for SCAN_HOR and SCAN_VER: // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) // - SCAN_VER because of equation (7-66) in H.265 (04/2013) @@ -1611,48 +1611,48 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( { SWAP(lastSigXPos, lastSigYPos); } - + // Encode the position of last significant coefficient coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, isChroma); - + //------------------------------------------------------------------------------------------------------------------- // Encode Coefficient levels - + significantFlagContextOffset = (!isChroma)? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - + contextOffset1 = 1; - + // Loop over subblocks subSetIndex = lastScanSet; do { EB_S32 numNonZero = 0; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) EB_U32 golombRiceParam = 0; EB_S32 index; EB_U32 contextSet; EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded EB_U32 contextOffset; EB_U32 contextOffset2; - + // 1. Subblock-level significance flag - + if (subSetIndex != 0) { - + if (subSetIndex != lastScanSet) { EB_U32 sigCoeffGroupContextIndex; EB_U32 significanceFlag; - + sigCoeffGroupContextIndex = 0; sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - + significanceFlag = (subblockSigmap[ subSetIndex ] != 0); - + // Add bits for coded_sub_block_flag coeffBits += CabacCost->CabacBitsSigMl[2*sigCoeffGroupContextIndex+significanceFlag]; - + if (!significanceFlag) { // Nothing else to do for this subblock since all coefficients in it are zero @@ -1660,9 +1660,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } } - + // 2. Coefficient significance flags - + // Use do {} while(0) loop to avoid goto statement (early exit) do { @@ -1673,7 +1673,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( EB_U32 tempOffset; const EB_U8 *contextIndexMapPtr; EB_U8 *bitsPtr; - + if ( subSetIndex == lastScanSet ) { absCoeff[ 0 ] = linearCoeffBufferPtr[ scanPosLast ]; @@ -1697,12 +1697,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( scanPosSig = subPosition + 15; sigMap <<= 16; } - + if (subSetIndex == 0) { subPosition2 = 1; } - + if (logBlockSize == 2) { tempOffset = 0; @@ -1714,7 +1714,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( tempOffset += (!isChroma && subSetIndex != 0 ) ? 3 : 0; contextIndexMapPtr = contextIndexMap8[ scanIndex != SCAN_DIAG2 ][ 0 ] - subPosition; } - + bitsPtr = CabacCost->CabacBitsSig + 2 * significantFlagContextOffset; bitsPtr += 2 * tempOffset; @@ -1723,9 +1723,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( { EB_U32 sigContextIndex; EB_S32 sigCoeffFlag = sigMap < 0; - + sigContextIndex = contextIndexMapPtr[ scanPosSig ]; - + // Add bits for sig_coeff_flag coeffBits += bitsPtr[2 * sigContextIndex + sigCoeffFlag]; @@ -1738,11 +1738,11 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( sigMap <<= 1; scanPosSig--; } - + if (scanPosSig == 0) { EB_S32 sigCoeffFlag = sigMap < 0; - + coeffBits += CabacCost->CabacBitsSig[ 2 * significantFlagContextOffset + sigCoeffFlag ]; if (sigCoeffFlag) @@ -1753,18 +1753,18 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } while (0); - + // 3. Coefficient level values - + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - + { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } if (greaterThan1Map[subSetIndex] == 0) { @@ -1774,7 +1774,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } continue; } - + // Loop over coefficients until base value of Exp-Golomb coding changes // Base value changes after either // - 8th coefficient @@ -1783,14 +1783,14 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( { EB_S32 absVal = absCoeff[ index ]; EB_U32 symbolValue = absVal > 1; - + // Add bits for coeff_abs_level_greater1_flag coeffBits += CabacCost->CabacBitsG1[2*(contextOffset+contextOffset1) + symbolValue]; - + if (symbolValue) { symbolValue = absVal > 2; - + // Add bits for coeff_abs_level_greater2_flag coeffBits += CabacCost->CabacBitsG2[2*(contextOffset2) + symbolValue]; @@ -1799,31 +1799,31 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( // Golomb Rice parameter is known to be 0 here coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 3, 0); } - + index++; // Exit loop early as remaining coefficients are coded differently break; } } - + // Loop over coefficients after first one that was > 1 but before 8th one // Base value is know to be equal to 2 for ( ; index < numCoeffWithCodedGt1Flag; index++) { EB_S32 absVal = absCoeff[ index ]; EB_U32 symbolValue = absVal > 1; - + // Add bits for >1 flag coeffBits += CabacCost->CabacBitsG1[2*contextOffset + symbolValue]; if (symbolValue) { coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 2, golombRiceParam); - + } } - + // Loop over remaining coefficients (8th and beyond) // Base value is known to be equal to 1 for ( ; index < numNonZero; index++ ) @@ -1834,9 +1834,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } while (--subSetIndex >= 0); - + // Add local bit counter to global bit counter *coeffBitsLong += coeffBits << 10; - + return return_error; } diff --git a/Source/Lib/Codec/EbComputeMean.h b/Source/Lib/Codec/EbComputeMean.h index e80631fad..d2dfe8d52 100644 --- a/Source/Lib/Codec/EbComputeMean.h +++ b/Source/Lib/Codec/EbComputeMean.h @@ -27,7 +27,7 @@ static const EB_COMPUTE_MEAN_FUNC ComputeMeanFunc[2][EB_ASM_TYPE_TOTAL] = { // C_DEFAULT ComputeMean, // AVX2 - ComputeMean8x8_AVX2_INTRIN + ComputeMean8x8_AVX2_INTRIN }, { // C_DEFAULT @@ -41,4 +41,4 @@ static const EB_COMPUTE_MEAN_FUNC ComputeMeanFunc[2][EB_ASM_TYPE_TOTAL] = { } #endif -#endif \ No newline at end of file +#endif diff --git a/Source/Lib/Codec/EbComputeSAD.h b/Source/Lib/Codec/EbComputeSAD.h index e8311a801..813afeb06 100644 --- a/Source/Lib/Codec/EbComputeSAD.h +++ b/Source/Lib/Codec/EbComputeSAD.h @@ -60,13 +60,13 @@ extern "C" { typedef EB_U32(*EB_COMPUTE8X4SAD_TYPE)( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr + EB_U8 *ref, // input parameter, reference samples Ptr EB_U32 refStride); // input parameter, reference stride typedef EB_U32(*EB_COMPUTE8X8SAD_TYPE)( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr + EB_U8 *ref, // input parameter, reference samples Ptr EB_U32 refStride); // input parameter, reference stride typedef void(*EB_GETEIGHTSAD8x8)( @@ -110,12 +110,12 @@ extern "C" { { /*0 4xM */ Compute4xMSad_SSE2_INTRIN, /*1 8xM */ Compute8xMSad_SSE2_INTRIN, - /*2 16xM */ Compute16xMSad_SSE2_INTRIN,//Compute16xMSad_AVX2_INTRIN is slower than the SSE2 version - /*3 24xM */ Compute24xMSad_AVX2_INTRIN, - /*4 32xM */ Compute32xMSad_AVX2_INTRIN, + /*2 16xM */ Compute16xMSad_SSE2_INTRIN,//Compute16xMSad_AVX2_INTRIN is slower than the SSE2 version + /*3 24xM */ Compute24xMSad_AVX2_INTRIN, + /*4 32xM */ Compute32xMSad_AVX2_INTRIN, /*5 40xM */ Compute40xMSad_AVX2_INTRIN, - /*6 48xM */ Compute48xMSad_AVX2_INTRIN, - /*7 56xM */ Compute56xMSad_AVX2_INTRIN, + /*6 48xM */ Compute48xMSad_AVX2_INTRIN, + /*7 56xM */ Compute56xMSad_AVX2_INTRIN, /*8 64xM */ Compute64xMSad_AVX2_INTRIN, }, }; diff --git a/Source/Lib/Codec/EbDeblockingFilter.c b/Source/Lib/Codec/EbDeblockingFilter.c index 351544963..f8a207260 100644 --- a/Source/Lib/Codec/EbDeblockingFilter.c +++ b/Source/Lib/Codec/EbDeblockingFilter.c @@ -29,40 +29,40 @@ const EB_U8 TcTable_8x8[54] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 24 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 24 }; const EB_S32 BetaTable_8x8[52] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }; void EncodePassUpdateSaoNeighborArrays( - NeighborArrayUnit_t *saoParamNeighborArray, - SaoParameters_t *saoParams, - EB_U32 originX, - EB_U32 originY, - EB_U32 size); + NeighborArrayUnit_t *saoParamNeighborArray, + SaoParameters_t *saoParams, + EB_U32 originX, + EB_U32 originY, + EB_U32 size); /** setQpArrayBasedOnCU() is used to set qp in the qpArray on a CU basis. */ void SetQpArrayBasedOnCU( - PictureControlSet_t *pictureControlSetPtr, //input parameter - EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU - EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU - EB_U32 cuSizeInMinCuSize, //input parameter - EB_U32 cuQp) //input parameter, Qp of the CU + PictureControlSet_t *pictureControlSetPtr, //input parameter + EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU + EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU + EB_U32 cuSizeInMinCuSize, //input parameter + EB_U32 cuQp) //input parameter, Qp of the CU { - EB_U32 verticalIdx; - EB_U32 qpArrayIdx = (cuPos_y / MIN_CU_SIZE) * pictureControlSetPtr->qpArrayStride + (cuPos_x / MIN_CU_SIZE); + EB_U32 verticalIdx; + EB_U32 qpArrayIdx = (cuPos_y / MIN_CU_SIZE) * pictureControlSetPtr->qpArrayStride + (cuPos_x / MIN_CU_SIZE); - for (verticalIdx = 0; verticalIdx < cuSizeInMinCuSize; ++verticalIdx) { - EB_MEMSET(pictureControlSetPtr->qpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, - cuQp, sizeof(EB_U8)*cuSizeInMinCuSize); - } + for (verticalIdx = 0; verticalIdx < cuSizeInMinCuSize; ++verticalIdx) { + EB_MEMSET(pictureControlSetPtr->qpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, + cuQp, sizeof(EB_U8)*cuSizeInMinCuSize); + } - return; + return; } @@ -70,368 +70,368 @@ void SetQpArrayBasedOnCU( is used to set qp in the qpArray on a CU basis. */ void entropySetQpArrayBasedOnCU( - PictureControlSet_t *pictureControlSetPtr, //input parameter - EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU - EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU - EB_U32 cuWidth, //input parameter - EB_U32 cuHeight, //input parameter - EB_U32 cuQp) //input parameter, Qp of the CU + PictureControlSet_t *pictureControlSetPtr, //input parameter + EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU + EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU + EB_U32 cuWidth, //input parameter + EB_U32 cuHeight, //input parameter + EB_U32 cuQp) //input parameter, Qp of the CU { - EB_U32 verticalIdx; - EB_U32 cuPos_xInMinCuSize = cuPos_x / MIN_CU_SIZE; - EB_U32 cuPos_yInMinCuSize = cuPos_y / MIN_CU_SIZE; - EB_U32 cuWidthInMinCuSize = cuWidth / MIN_CU_SIZE; - EB_U32 cuHeightInMinCuSize = cuHeight / MIN_CU_SIZE; - EB_U32 qpArrayIdx = cuPos_yInMinCuSize * pictureControlSetPtr->qpArrayStride + cuPos_xInMinCuSize; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - (cuPos_x % MIN_CU_SIZE == 0 && cuPos_y % MIN_CU_SIZE == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR4); - - CHECK_REPORT_ERROR( - (cuWidth % MIN_CU_SIZE == 0 && cuHeight % MIN_CU_SIZE == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR4); - for (verticalIdx = 0; verticalIdx < cuHeightInMinCuSize; ++verticalIdx) { - EB_MEMSET(pictureControlSetPtr->entropyQpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, - cuQp, sizeof(EB_U8)*cuWidthInMinCuSize); - } - - return; + EB_U32 verticalIdx; + EB_U32 cuPos_xInMinCuSize = cuPos_x / MIN_CU_SIZE; + EB_U32 cuPos_yInMinCuSize = cuPos_y / MIN_CU_SIZE; + EB_U32 cuWidthInMinCuSize = cuWidth / MIN_CU_SIZE; + EB_U32 cuHeightInMinCuSize = cuHeight / MIN_CU_SIZE; + EB_U32 qpArrayIdx = cuPos_yInMinCuSize * pictureControlSetPtr->qpArrayStride + cuPos_xInMinCuSize; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + (cuPos_x % MIN_CU_SIZE == 0 && cuPos_y % MIN_CU_SIZE == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR4); + + CHECK_REPORT_ERROR( + (cuWidth % MIN_CU_SIZE == 0 && cuHeight % MIN_CU_SIZE == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR4); + for (verticalIdx = 0; verticalIdx < cuHeightInMinCuSize; ++verticalIdx) { + EB_MEMSET(pictureControlSetPtr->entropyQpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, + cuQp, sizeof(EB_U8)*cuWidthInMinCuSize); + } + + return; } /** CalculateBSForPUBoundary() is used to calulate the bS for a particular(horizontal/vertical) edge of a 4x4 block on the PU boundary. */ EB_U8 CalculateBSForPUBoundary( - EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. - PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. - PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. - EB_MODETYPE puCodingMode, - EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, //input parameter - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) //input parameter + EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. + PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. + PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. + EB_MODETYPE puCodingMode, + EB_MODETYPE neighbourPuCodingMode, + EB_BOOL isVerticalEdge, //input parameter + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) //input parameter { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - EB_BOOL bSDeterminationCondition1; - EB_BOOL bSDeterminationCondition2; - EB_BOOL bSDeterminationCondition3; - EB_PICTURE sliceType; - EB_U64 puRefList0POC; - EB_U64 puRefList1POC; - EB_U64 neighborPuRefList0POC; - EB_U64 neighborPuRefList1POC; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - sliceType = pictureControlSetPtr->sliceType; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - switch (sliceType) { - case EB_P_PICTURE: - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - // different number of motion vectors or difference reference pictures - bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); - - // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition3 = (EB_BOOL)(( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); - - break; - - case EB_B_PICTURE: - switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { - case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - break; - case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - - break; - case 2: // BI_PRED + UNI_PRED_LIST_0 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1)); - - break; - case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - - break; - case 5: // BI_PRED + UNI_PRED_LIST_1 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 6: // UNI_PRED_LIST_0 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 7: // UNI_PRED_LIST_1 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 8: // BI_PRED + BI_PRED - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && - (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - - bSDeterminationCondition1 = (EB_BOOL)( - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)) && - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0))); - } - else { - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - } - else { - if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - } - else { - bSDeterminationCondition1 = EB_TRUE; - } - } - } - - break; - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR2); - bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! - break; - } - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); - - break; - - case EB_I_PICTURE: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR3); - break; - - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR5); - break; - } - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + EB_BOOL bSDeterminationCondition1; + EB_BOOL bSDeterminationCondition2; + EB_BOOL bSDeterminationCondition3; + EB_PICTURE sliceType; + EB_U64 puRefList0POC; + EB_U64 puRefList1POC; + EB_U64 neighborPuRefList0POC; + EB_U64 neighborPuRefList1POC; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + sliceType = pictureControlSetPtr->sliceType; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + switch (sliceType) { + case EB_P_PICTURE: + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + // different number of motion vectors or difference reference pictures + bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); + + // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition3 = (EB_BOOL)(( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); + + break; + + case EB_B_PICTURE: + switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { + case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + break; + case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + + break; + case 2: // BI_PRED + UNI_PRED_LIST_0 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1)); + + break; + case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + + break; + case 5: // BI_PRED + UNI_PRED_LIST_1 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 6: // UNI_PRED_LIST_0 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 7: // UNI_PRED_LIST_1 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 8: // BI_PRED + BI_PRED + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && + (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + + bSDeterminationCondition1 = (EB_BOOL)( + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)) && + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0))); + } + else { + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + } + else { + if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + } + else { + bSDeterminationCondition1 = EB_TRUE; + } + } + } + + break; + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR2); + bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! + break; + } + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); + + break; + + case EB_I_PICTURE: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR3); + break; + + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR5); + break; + } + } + + return bS; } void SetBSArrayBasedOnPUBoundary( - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - PredictionUnit_t *puPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + PredictionUnit_t *puPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EB_U32 tbOriginX, + EB_U32 tbOriginY, EB_BOOL tileLeftBoundary, EB_BOOL tileTopBoundary, - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - // MV Uint - MvUnit_t *mvUnitPtr; - - // 4x4 block - EB_U32 puTopLeft4x4blkAddr = (cuStatsPtr->originX >> 2) + ((cuStatsPtr->originY >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (cuStatsPtr->size >> 2) - 1; - EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((cuStatsPtr->size >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; - EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block - EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block - // PU - //PredictionUnit_t *neighbourPuPtrOLD; - PredictionUnit_t neighbourPu; - EB_MODETYPE neighbourPuMode; - EB_U32 neighborPuIdx; - - // set bS for the horizontal PU boundary which lies on the 8 sample edge - //if ((cuStatsPtr->originY & 7) == 0 && cuStatsPtr->originY + tbOriginY != 0) { - if ((cuStatsPtr->originY & 7) == 0 && !tileTopBoundary) { - - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { - - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; - - neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; - - horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForPUBoundary( - tbOriginX + blk4x4Pos_x, // to be modified - tbOriginY + blk4x4Pos_y, // to be modified - puPtr, - &neighbourPu, - (EB_MODETYPE)cuPtr->predictionModeFlag, - neighbourPuMode, - EB_FALSE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - // set bS for the vertical PU boundary which lies on the 8 sample edge - //if ((cuStatsPtr->originX & 7) == 0 && cuStatsPtr->originX + tbOriginX != 0) { - if ((cuStatsPtr->originX & 7) == 0 && !tileLeftBoundary) { - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; - - - neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; - - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForPUBoundary( - tbOriginX + blk4x4Pos_x, // to be modified - tbOriginY + blk4x4Pos_y, // to be modified - puPtr, - &neighbourPu, - (EB_MODETYPE)cuPtr->predictionModeFlag, - neighbourPuMode, - EB_TRUE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + // MV Uint + MvUnit_t *mvUnitPtr; + + // 4x4 block + EB_U32 puTopLeft4x4blkAddr = (cuStatsPtr->originX >> 2) + ((cuStatsPtr->originY >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (cuStatsPtr->size >> 2) - 1; + EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((cuStatsPtr->size >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; + EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block + EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block + // PU + //PredictionUnit_t *neighbourPuPtrOLD; + PredictionUnit_t neighbourPu; + EB_MODETYPE neighbourPuMode; + EB_U32 neighborPuIdx; + + // set bS for the horizontal PU boundary which lies on the 8 sample edge + //if ((cuStatsPtr->originY & 7) == 0 && cuStatsPtr->originY + tbOriginY != 0) { + if ((cuStatsPtr->originY & 7) == 0 && !tileTopBoundary) { + + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { + + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; + + neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + + horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForPUBoundary( + tbOriginX + blk4x4Pos_x, // to be modified + tbOriginY + blk4x4Pos_y, // to be modified + puPtr, + &neighbourPu, + (EB_MODETYPE)cuPtr->predictionModeFlag, + neighbourPuMode, + EB_FALSE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + // set bS for the vertical PU boundary which lies on the 8 sample edge + //if ((cuStatsPtr->originX & 7) == 0 && cuStatsPtr->originX + tbOriginX != 0) { + if ((cuStatsPtr->originX & 7) == 0 && !tileLeftBoundary) { + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; + + + neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForPUBoundary( + tbOriginX + blk4x4Pos_x, // to be modified + tbOriginY + blk4x4Pos_y, // to be modified + puPtr, + &neighbourPu, + (EB_MODETYPE)cuPtr->predictionModeFlag, + neighbourPuMode, + EB_TRUE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } /** CalculateBSForTUBoundaryInsidePU() @@ -439,29 +439,29 @@ is used to calulate the bS for a particular(horizontal/vertical) edge of a 4x4 b TU boundary which lays inside a PU. */ static inline EB_U8 CalculateBSForTUBoundaryInsidePU( - EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. - EB_BOOL isVerticalEdge, //input paramter - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) + EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. + EB_BOOL isVerticalEdge, //input paramter + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (cuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (cuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; + } + + return bS; } /** SetBSArrayBasedOnTUBoundary() @@ -470,462 +470,462 @@ is used to calulate the bS on TU boundary. Note - This implementation is based on the assumption that the TU can never go across the PU. */ void SetBSArrayBasedOnTUBoundary( - EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. - EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. - EB_U32 tuWidth, //input parameter - EB_U32 tuHeight, //input parameter - //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. - const CodedUnitStats_t *cuStatsPtr, - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. - EB_U32 tbOriginX, - EB_U32 tbOriginY, - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. + EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. + EB_U32 tuWidth, //input parameter + EB_U32 tuHeight, //input parameter + //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. + const CodedUnitStats_t *cuStatsPtr, + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. + EB_U32 tbOriginX, + EB_U32 tbOriginY, + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; - EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; - EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; + EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; + EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; - //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU + //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU if ((tuPos_y & 7) == 0 && tuPos_y != 0 && tuPos_y != tbOriginY + cuStatsPtr->originY) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { - horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_FALSE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { + horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_FALSE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU if ((tuPos_x & 7) == 0 && tuPos_x != 0 && tuPos_x != tbOriginX + cuStatsPtr->originX) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_TRUE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_TRUE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } EB_U8 Intra4x4CalculateBSForPUBoundary( - EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. - PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. - PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. - EB_MODETYPE puCodingMode, - EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, //input parameter - EB_BOOL isVerticalPuBoundaryAlsoTuBoundary, //input parameter - EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary, - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) //input parameter + EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. + PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. + PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. + EB_MODETYPE puCodingMode, + EB_MODETYPE neighbourPuCodingMode, + EB_BOOL isVerticalEdge, //input parameter + EB_BOOL isVerticalPuBoundaryAlsoTuBoundary, //input parameter + EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary, + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) //input parameter { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - EB_BOOL bSDeterminationCondition1; - EB_BOOL bSDeterminationCondition2; - EB_BOOL bSDeterminationCondition3; - EB_BOOL isTuBoundary = isVerticalEdge ? isVerticalPuBoundaryAlsoTuBoundary : isHorizontalPuBoundaryAlsoTuBoundary; - EB_PICTURE sliceType; - EB_U64 puRefList0POC; - EB_U64 puRefList1POC; - EB_U64 neighborPuRefList0POC; - EB_U64 neighborPuRefList1POC; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - sliceType = pictureControlSetPtr->sliceType; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - switch (sliceType) { - case EB_P_PICTURE: - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - // different number of motion vectors or difference reference pictures - bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); - - // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition3 = (EB_BOOL)(isTuBoundary && ( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); - - break; - - case EB_B_PICTURE: - switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { - case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - break; - case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - - break; - case 2: // BI_PRED + UNI_PRED_LIST_0 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1)); - - break; - case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - - break; - case 5: // BI_PRED + UNI_PRED_LIST_1 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 6: // UNI_PRED_LIST_0 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 7: // UNI_PRED_LIST_1 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 8: // BI_PRED + BI_PRED - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && - (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - - bSDeterminationCondition1 = (EB_BOOL)( - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)) && - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0))); - } - else { - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - } - else { - if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - } - else { - bSDeterminationCondition1 = EB_TRUE; - } - } - } - - break; - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR2); - bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! - break; - } - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(isTuBoundary && ( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); - - break; - - case EB_I_PICTURE: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR3); - break; - - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR5); - break; - } - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + EB_BOOL bSDeterminationCondition1; + EB_BOOL bSDeterminationCondition2; + EB_BOOL bSDeterminationCondition3; + EB_BOOL isTuBoundary = isVerticalEdge ? isVerticalPuBoundaryAlsoTuBoundary : isHorizontalPuBoundaryAlsoTuBoundary; + EB_PICTURE sliceType; + EB_U64 puRefList0POC; + EB_U64 puRefList1POC; + EB_U64 neighborPuRefList0POC; + EB_U64 neighborPuRefList1POC; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + sliceType = pictureControlSetPtr->sliceType; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + switch (sliceType) { + case EB_P_PICTURE: + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + // different number of motion vectors or difference reference pictures + bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); + + // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition3 = (EB_BOOL)(isTuBoundary && ( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); + + break; + + case EB_B_PICTURE: + switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { + case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + break; + case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + + break; + case 2: // BI_PRED + UNI_PRED_LIST_0 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1)); + + break; + case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + + break; + case 5: // BI_PRED + UNI_PRED_LIST_1 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 6: // UNI_PRED_LIST_0 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 7: // UNI_PRED_LIST_1 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 8: // BI_PRED + BI_PRED + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && + (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + + bSDeterminationCondition1 = (EB_BOOL)( + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)) && + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0))); + } + else { + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + } + else { + if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + } + else { + bSDeterminationCondition1 = EB_TRUE; + } + } + } + + break; + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR2); + bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! + break; + } + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(isTuBoundary && ( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); + + break; + + case EB_I_PICTURE: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR3); + break; + + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR5); + break; + } + } + + return bS; } static inline EB_U8 Intra4x4CalculateBSForTUBoundaryInsidePU( - EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. - EB_BOOL isVerticalEdge, //input paramter - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) + EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. + EB_BOOL isVerticalEdge, //input paramter + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (cuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (cuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; + } + + return bS; } void Intra4x4SetBSArrayBasedOnTUBoundary( - EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. - EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. - EB_U32 tuWidth, //input parameter - EB_U32 tuHeight, //input parameter - EB_BOOL isHorizontalTuBoundaryAlsoPuBoundary, //input parameter - EB_BOOL isVerticalTuBoundaryAlsoPuBoundary, //input parameter - //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. - const CodedUnitStats_t *cuStatsPtr, - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. - EB_U32 tbOriginX, - EB_U32 tbOriginY, - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. + EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. + EB_U32 tuWidth, //input parameter + EB_U32 tuHeight, //input parameter + EB_BOOL isHorizontalTuBoundaryAlsoPuBoundary, //input parameter + EB_BOOL isVerticalTuBoundaryAlsoPuBoundary, //input parameter + //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. + const CodedUnitStats_t *cuStatsPtr, + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. + EB_U32 tbOriginX, + EB_U32 tbOriginY, + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; - - EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; - EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; - - //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU - if ((tuPos_y & 7) == 0 && tuPos_y != 0 && tuPos_y != tbOriginY + cuStatsPtr->originY && !isHorizontalTuBoundaryAlsoPuBoundary) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { - horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = Intra4x4CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_FALSE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU - if ((tuPos_x & 7) == 0 && tuPos_x != 0 && tuPos_x != tbOriginX + cuStatsPtr->originX && !isVerticalTuBoundaryAlsoPuBoundary) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = Intra4x4CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_TRUE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + + EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; + EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; + + //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU + if ((tuPos_y & 7) == 0 && tuPos_y != 0 && tuPos_y != tbOriginY + cuStatsPtr->originY && !isHorizontalTuBoundaryAlsoPuBoundary) { + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { + horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = Intra4x4CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_FALSE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU + if ((tuPos_x & 7) == 0 && tuPos_x != 0 && tuPos_x != tbOriginX + cuStatsPtr->originX && !isVerticalTuBoundaryAlsoPuBoundary) { + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = Intra4x4CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_TRUE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } void Intra4x4SetBSArrayBasedOnPUBoundary( - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - PredictionUnit_t *puPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EB_U32 puOriginX, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + PredictionUnit_t *puPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_BOOL isVerticalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. - EB_BOOL isHorizontalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + EB_U32 tbOriginY, + EB_BOOL isVerticalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. + EB_BOOL isHorizontalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - - // MV Uint - MvUnit_t *mvUnitPtr; - - // 4x4 block - EB_U32 puTopLeft4x4blkAddr = (puOriginX >> 2) + ((puOriginY >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (puWidth >> 2) - 1; - EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((puHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; - EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block - EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block - EB_BOOL isVerticalPuBoundaryAlsoTuBoundary; - EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - // PU - //PredictionUnit_t *neighbourPuPtrOLD; - PredictionUnit_t neighbourPu; - EB_MODETYPE neighbourPuMode; - EB_U32 neighborPuIdx; - - /*CHECK_REPORT_ERROR( - (cuPtr->partitionMode == SIZE_2Nx2N), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR6);*/ - - // set bS for the horizontal PU boundary which lies on the 8 sample edge - if ((puOriginY & 7) == 0 && puOriginY + tbOriginY != 0 && !isHorizontalPUBoundaryAlsoPictureBoundary) { - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { - - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - - if (puOriginY == cuStatsPtr->originY){ - isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - if (puOriginX == cuStatsPtr->originX){ - isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - - CHECK_REPORT_ERROR( - ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR6); - - neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; - - - CHECK_REPORT_ERROR( - (*(modeTypeNeighborArray->topArray + neighborPuIdx) != (EB_U8)INVALID_MODE), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR9); - - neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + + // MV Uint + MvUnit_t *mvUnitPtr; + + // 4x4 block + EB_U32 puTopLeft4x4blkAddr = (puOriginX >> 2) + ((puOriginY >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (puWidth >> 2) - 1; + EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((puHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; + EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block + EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block + EB_BOOL isVerticalPuBoundaryAlsoTuBoundary; + EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + // PU + //PredictionUnit_t *neighbourPuPtrOLD; + PredictionUnit_t neighbourPu; + EB_MODETYPE neighbourPuMode; + EB_U32 neighborPuIdx; + + /*CHECK_REPORT_ERROR( + (cuPtr->partitionMode == SIZE_2Nx2N), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR6);*/ + + // set bS for the horizontal PU boundary which lies on the 8 sample edge + if ((puOriginY & 7) == 0 && puOriginY + tbOriginY != 0 && !isHorizontalPUBoundaryAlsoPictureBoundary) { + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { + + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + + if (puOriginY == cuStatsPtr->originY){ + isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + if (puOriginX == cuStatsPtr->originX){ + isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + + CHECK_REPORT_ERROR( + ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR6); + + neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; + + + CHECK_REPORT_ERROR( + (*(modeTypeNeighborArray->topArray + neighborPuIdx) != (EB_U8)INVALID_MODE), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR9); + + neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] = Intra4x4CalculateBSForPUBoundary( @@ -940,63 +940,63 @@ void Intra4x4SetBSArrayBasedOnPUBoundary( EB_FALSE, pictureControlSetPtr, sequenceControlSetPtr); - } - } - - // set bS for the vertical PU boundary which lies on the 8 sample edge - if ((puOriginX & 7) == 0 && puOriginX + tbOriginX != 0 && !isVerticalPUBoundaryAlsoPictureBoundary) { - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - - if (puOriginY == cuStatsPtr->originY){ - isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - if (puOriginX == cuStatsPtr->originX){ - isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - - CHECK_REPORT_ERROR( - ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR6); - - neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; - - CHECK_REPORT_ERROR( - (*(modeTypeNeighborArray->leftArray + neighborPuIdx) != (EB_U8)INVALID_MODE), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR9); - - neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; - - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = Intra4x4CalculateBSForPUBoundary( - tbOriginX + blk4x4Pos_x, // to be modified - tbOriginY + blk4x4Pos_y, // to be modified - puPtr, - &neighbourPu, - (EB_MODETYPE)cuPtr->predictionModeFlag, - neighbourPuMode, - EB_TRUE, - isVerticalPuBoundaryAlsoTuBoundary, - isHorizontalPuBoundaryAlsoTuBoundary, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + } + } + + // set bS for the vertical PU boundary which lies on the 8 sample edge + if ((puOriginX & 7) == 0 && puOriginX + tbOriginX != 0 && !isVerticalPUBoundaryAlsoPictureBoundary) { + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + + if (puOriginY == cuStatsPtr->originY){ + isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + if (puOriginX == cuStatsPtr->originX){ + isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + + CHECK_REPORT_ERROR( + ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR6); + + neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; + + CHECK_REPORT_ERROR( + (*(modeTypeNeighborArray->leftArray + neighborPuIdx) != (EB_U8)INVALID_MODE), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR9); + + neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = Intra4x4CalculateBSForPUBoundary( + tbOriginX + blk4x4Pos_x, // to be modified + tbOriginY + blk4x4Pos_y, // to be modified + puPtr, + &neighbourPu, + (EB_MODETYPE)cuPtr->predictionModeFlag, + neighbourPuMode, + EB_TRUE, + isVerticalPuBoundaryAlsoTuBoundary, + isHorizontalPuBoundaryAlsoTuBoundary, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } @@ -1025,373 +1025,373 @@ centerSamplePos_y is the picutre-wise vertical location of the start sample of e reconPictureControlSet is the pointer to the PictureControlSet of the reconstructed picture */ static void Luma8x8blkDLFCore( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. - EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. - EB_U8 bSEdgeA, //please refer to the detailed explantion above. - EB_U8 bSEdgeB, //please refer to the detailed explantion above. - EB_U8 bSEdgeC, //please refer to the detailed explantion above. - EB_U8 bSEdgeD, //please refer to the detailed explantion above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. + EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. + EB_U8 bSEdgeA, //please refer to the detailed explantion above. + EB_U8 bSEdgeB, //please refer to the detailed explantion above. + EB_U8 bSEdgeC, //please refer to the detailed explantion above. + EB_U8 bSEdgeD, //please refer to the detailed explantion above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. { - EB_U32 curCuQp; - EB_BYTE edgeStartFilteredSamplePtr; - EB_U32 neighbourCuQp; - EB_S32 CUqpIndex; - EB_U32 Qp; - EB_U32 Tc; - EB_S32 Beta; - //EB_BOOL PCMFlagArray[2]; - - //vertical edge A filtering - if (bSEdgeA > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset )]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - } - - //vertical edge C filtering - if (bSEdgeC > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - } - - //horizontal edge B filtering - if (bSEdgeB > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - //horizontal edge D filtering - if (bSEdgeD > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - return; + EB_U32 curCuQp; + EB_BYTE edgeStartFilteredSamplePtr; + EB_U32 neighbourCuQp; + EB_S32 CUqpIndex; + EB_U32 Qp; + EB_U32 Tc; + EB_S32 Beta; + //EB_BOOL PCMFlagArray[2]; + + //vertical edge A filtering + if (bSEdgeA > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset )]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + } + + //vertical edge C filtering + if (bSEdgeC > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + } + + //horizontal edge B filtering + if (bSEdgeB > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + //horizontal edge D filtering + if (bSEdgeD > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + return; } void Luma8x8blkDLFCore16bit( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. - EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. - EB_U8 bSEdgeA, //please refer to the detailed explantion above. - EB_U8 bSEdgeB, //please refer to the detailed explantion above. - EB_U8 bSEdgeC, //please refer to the detailed explantion above. - EB_U8 bSEdgeD, //please refer to the detailed explantion above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. + EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. + EB_U8 bSEdgeA, //please refer to the detailed explantion above. + EB_U8 bSEdgeB, //please refer to the detailed explantion above. + EB_U8 bSEdgeC, //please refer to the detailed explantion above. + EB_U8 bSEdgeD, //please refer to the detailed explantion above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. { - EB_U32 curCuQp; - EB_U32 neighbourCuQp; - EB_S32 CUqpIndex; - EB_U32 Qp; - EB_U32 Tc; - EB_S32 Beta; - EB_U16 *edgeStartFilteredSamplePtr; - //EB_BOOL PCMFlagArray[2]; - - //vertical edge A filtering - if (bSEdgeA > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - } - - //vertical edge C filtering - if (bSEdgeC > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - //PCMFlagArray); - } - - //horizontal edge B filtering - if (bSEdgeB > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - //horizontal edge D filtering - if (bSEdgeD > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - return; + EB_U32 curCuQp; + EB_U32 neighbourCuQp; + EB_S32 CUqpIndex; + EB_U32 Qp; + EB_U32 Tc; + EB_S32 Beta; + EB_U16 *edgeStartFilteredSamplePtr; + //EB_BOOL PCMFlagArray[2]; + + //vertical edge A filtering + if (bSEdgeA > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + } + + //vertical edge C filtering + if (bSEdgeC > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + //PCMFlagArray); + } + + //horizontal edge B filtering + if (bSEdgeB > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + //horizontal edge D filtering + if (bSEdgeD > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + return; } /** chroma8x8blkDLFCore() @@ -1423,835 +1423,835 @@ bSEdgeDArray[0] - bS of the left 2 sample of edge D. bSEdgeAArray[1] - bS of the reconPictureControlSet is the pointer to the PictureControlSet of the reconstructed picture */ static void chroma8x8blkDLFCore( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. - EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. - EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. + EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. + EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. { - EB_U8 curCuQp; - EB_BYTE edgeStartSampleCb; - EB_BYTE edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; + EB_U8 curCuQp; + EB_BYTE edgeStartSampleCb; + EB_BYTE edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - //vertical edge A filtering - if (bSEdgeAArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + //vertical edge A filtering + if (bSEdgeAArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - - } - if (bSEdgeAArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + + } + if (bSEdgeAArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - - } - - //vertical edge C filtering - if (bSEdgeCArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + + } + + //vertical edge C filtering + if (bSEdgeCArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - } - - if (bSEdgeCArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + } + + if (bSEdgeCArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - } - - //horizontal edge B filtering - if (bSEdgeBArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + } + + //horizontal edge B filtering + if (bSEdgeBArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - if (bSEdgeBArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + if (bSEdgeBArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - //horizontal edge D filtering - if (bSEdgeDArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + //horizontal edge D filtering + if (bSEdgeDArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; - - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - if (bSEdgeDArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; + + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + if (bSEdgeDArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x + 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - return; + centerSamplePos_x + 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + return; } static void chroma8x8blkDLFCore16bit( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. - EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. - EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. + EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. + EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. { - EB_U8 curCuQp; - EB_U16 *edgeStartSampleCb; - EB_U16 *edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; + EB_U8 curCuQp; + EB_U16 *edgeStartSampleCb; + EB_U16 *edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - //vertical edge A filtering - if (bSEdgeAArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + //vertical edge A filtering + if (bSEdgeAArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - if (bSEdgeAArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + if (bSEdgeAArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - //vertical edge C filtering - if (bSEdgeCArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + //vertical edge C filtering + if (bSEdgeCArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - if (bSEdgeCArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + if (bSEdgeCArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - //horizontal edge B filtering - if (bSEdgeBArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + //horizontal edge B filtering + if (bSEdgeBArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - if (bSEdgeBArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + if (bSEdgeBArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - //horizontal edge D filtering - if (bSEdgeDArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + //horizontal edge D filtering + if (bSEdgeDArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; - - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - if (bSEdgeDArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; + + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + if (bSEdgeDArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x + 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - return; + centerSamplePos_x + 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + return; } /** LCUInternalAreaDLFCore() is used to apply the deblocking filter in the LCU internal area (excluding the LCU boundary) as the first pass DLF. */ EB_ERRORTYPE LCUInternalAreaDLFCore( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. - PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. + PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. { - EB_ERRORTYPE return_error = EB_ErrorNone; - - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U8 bS; - - // variables for luma componet - EB_U32 blk4x4Addr; - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; - EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; - EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; - EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; - EB_S32 Beta; - - // variables for chroma component - EB_U32 blk2x2Addr; - EB_U32 twoSampleEdgeStartSamplePos_x; - EB_U32 twoSampleEdgeStartSamplePos_y; + EB_ERRORTYPE return_error = EB_ErrorNone; + + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U8 bS; + + // variables for luma componet + EB_U32 blk4x4Addr; + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; + EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; + EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; + EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; + EB_S32 Beta; + + // variables for chroma component + EB_U32 blk2x2Addr; + EB_U32 twoSampleEdgeStartSamplePos_x; + EB_U32 twoSampleEdgeStartSamplePos_y; EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; @@ -2264,247 +2264,247 @@ EB_ERRORTYPE LCUInternalAreaDLFCore( EB_U32 numVerticalChromaSampleEdges = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); EB_U32 numHorizontalChromaSampleEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); EB_U32 num2SampleEdgesPerVerticalChromaSampleEdge = (lcuHeight >> (colorFormat==EB_YUV420?2:1)) - 2 - (((lcuHeight & (colorFormat==EB_YUV420?15:7)) == 0) << 1); - EB_U32 num2SampleEdgesPerHorizontalChromaSampleEdge = (lcuWidth >> (colorFormat==EB_YUV444?1:2)) - 2 - (((lcuWidth & (colorFormat==EB_YUV444?7:15)) == 0) << 1); - EB_U8 curCuQp; - EB_BYTE edgeStartFilteredSamplePtr; - EB_BYTE edgeStartSampleCb; - EB_BYTE edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR8); - - /***** luma component filtering *****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { - // edge B - fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - } - - - /***** chroma component filtering ****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { - twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + EB_U32 num2SampleEdgesPerHorizontalChromaSampleEdge = (lcuWidth >> (colorFormat==EB_YUV444?1:2)) - 2 - (((lcuWidth & (colorFormat==EB_YUV444?7:15)) == 0) << 1); + EB_U8 curCuQp; + EB_BYTE edgeStartFilteredSamplePtr; + EB_BYTE edgeStartSampleCb; + EB_BYTE edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR8); + + /***** luma component filtering *****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { + // edge B + fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + } + + + /***** chroma component filtering ****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { + twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_TRUE, - cbTc, - crTc); - - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { - twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position - twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_TRUE, + cbTc, + crTc); + + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { + twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position + twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_FALSE, - cbTc, - crTc); - - } - } - } - - return return_error; + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_FALSE, + cbTc, + crTc); + + } + } + } + + return return_error; } /** LCUInternalAreaDLFCore16bit() @@ -2512,38 +2512,38 @@ is used to apply the deblocking filter in the LCU internal area (excluding the L as the first pass DLF. */ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. - PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. + PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. { - EB_ERRORTYPE return_error = EB_ErrorNone; - - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U8 bS; - - // variables for luma componet - EB_U32 blk4x4Addr; - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; - EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; - EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; - EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; - EB_S32 Beta; - - // variables for chroma component - EB_U32 blk2x2Addr; - EB_U32 twoSampleEdgeStartSamplePos_x; - EB_U32 twoSampleEdgeStartSamplePos_y; + EB_ERRORTYPE return_error = EB_ErrorNone; + + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U8 bS; + + // variables for luma componet + EB_U32 blk4x4Addr; + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; + EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; + EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; + EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; + EB_S32 Beta; + + // variables for chroma component + EB_U32 blk2x2Addr; + EB_U32 twoSampleEdgeStartSamplePos_x; + EB_U32 twoSampleEdgeStartSamplePos_y; EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; const EB_S32 subWidthC = (colorFormat == EB_YUV444) ? 1 : 2; const EB_S32 subHeightC = (colorFormat == EB_YUV420) ? 2 : 1; @@ -2553,7 +2553,7 @@ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( const EB_S32 subHeightCMinus1 = (colorFormat == EB_YUV420) ? 1 : 0; EB_U32 chromaLcuPos_x = lcuPos_x >> subWidthCMinus1; - EB_U32 chromaLcuPos_y = lcuPos_y >> subHeightCMinus1; + EB_U32 chromaLcuPos_y = lcuPos_y >> subHeightCMinus1; EB_U32 numVerticalChromaSampleEdges = (lcuWidth >> (3 + subWidthCMinus1)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); EB_U32 numHorizontalChromaSampleEdges = (lcuHeight >> (3 + subHeightCMinus1)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); @@ -2562,263 +2562,263 @@ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( - EB_U8 curCuQp; - EB_U16 *edgeStartFilteredSamplePtr; - EB_U16 *edgeStartSampleCb; - EB_U16 *edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR10); - - - /***** luma component filtering *****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - lumaTc = lumaTc << 2; - Beta = Beta << 2; - - edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { - // edge B - fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - lumaTc = lumaTc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - } - - /***** chroma component filtering ****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { - twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + EB_U8 curCuQp; + EB_U16 *edgeStartFilteredSamplePtr; + EB_U16 *edgeStartSampleCb; + EB_U16 *edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR10); + + + /***** luma component filtering *****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + lumaTc = lumaTc << 2; + Beta = Beta << 2; + + edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { + // edge B + fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + lumaTc = lumaTc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + } + + /***** chroma component filtering ****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { + twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { - twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position - twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { + twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position + twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - } - } - - return return_error; + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + } + } + + return return_error; } @@ -2826,1163 +2826,1163 @@ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( is used to apply the deblocking filter on the LCU boundary */ void LCUBoundaryDLFCore( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. - EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. - EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. + EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. + EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - // luma variable - EB_U32 edgeABlk4x4Addr; - EB_U32 edgeBBlk4x4Addr; - EB_U32 edgeCBlk4x4Addr; - EB_U32 edgeDBlk4x4Addr; - EB_U8 bSLumaEdgeA; - EB_U8 bSLumaEdgeB; - EB_U8 bSLumaEdgeC; - EB_U8 bSLumaEdgeD; - EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; - EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; - - // chroma variable - EB_U32 edgeAUpperBlk2x2Addr; - EB_U32 edgeALowerBlk2x2Addr; - EB_U32 edgeBLeftBlk2x2Addr; - EB_U32 edgeBRightBlk2x2Addr; - EB_U32 edgeCUpperBlk2x2Addr; - EB_U32 edgeCLowerBlk2x2Addr; - EB_U32 edgeDLeftBlk2x2Addr; - EB_U32 edgeDRightBlk2x2Addr; - EB_U8 bSChromaEdgeA[2]; - EB_U8 bSChromaEdgeB[2]; - EB_U8 bSChromaEdgeC[2]; - EB_U8 bSChromaEdgeD[2]; - EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; + // luma variable + EB_U32 edgeABlk4x4Addr; + EB_U32 edgeBBlk4x4Addr; + EB_U32 edgeCBlk4x4Addr; + EB_U32 edgeDBlk4x4Addr; + EB_U8 bSLumaEdgeA; + EB_U8 bSLumaEdgeB; + EB_U8 bSLumaEdgeC; + EB_U8 bSLumaEdgeD; + EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; + EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; + + // chroma variable + EB_U32 edgeAUpperBlk2x2Addr; + EB_U32 edgeALowerBlk2x2Addr; + EB_U32 edgeBLeftBlk2x2Addr; + EB_U32 edgeBRightBlk2x2Addr; + EB_U32 edgeCUpperBlk2x2Addr; + EB_U32 edgeCLowerBlk2x2Addr; + EB_U32 edgeDLeftBlk2x2Addr; + EB_U32 edgeDRightBlk2x2Addr; + EB_U8 bSChromaEdgeA[2]; + EB_U8 bSChromaEdgeB[2]; + EB_U8 bSChromaEdgeC[2]; + EB_U8 bSChromaEdgeD[2]; + EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; EB_U32 chromaLcuPos_x = lcuPos_x >> (colorFormat==EB_YUV444?0:1); EB_U32 chromaLcuPos_y = lcuPos_y >> (colorFormat==EB_YUV420?1:0); - EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); - EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); - EB_U32 horizontalIdx; - EB_U32 verticalIdx; + EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); + EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); + EB_U32 horizontalIdx; + EB_U32 verticalIdx; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; - EB_U32 chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); - EB_U32 chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + EB_U32 chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); + EB_U32 chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR8); - - /***** luma component filtering *****/ - // filter the top-left corner 8x8 luma block - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 luma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - (horizontalIdx << 3) - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore( - reconpicture, - reconpicture->strideY, - lcuPos_x + (horizontalIdx << 3), - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 luma block column - for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - (verticalIdx << 3) - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y + (verticalIdx << 3), - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - /***** chroma components filtering *****/ - // filter the top-left corner 8x8 chroma block - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 2 >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 chroma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((horizontalIdx << 3) - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((horizontalIdx << 3) - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - 0, - logMaxLcuSizeIn4x4blk); - - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((horizontalIdx << 3) + 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x + (horizontalIdx << 3), - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 chroma block column - for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - ((verticalIdx << 3) - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - ((verticalIdx << 3) - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 4) >> subWidthShfitMinus1, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 2) >> subWidthShfitMinus1, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - ((verticalIdx << 3) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 2 >> subWidthShfitMinus1, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y + (verticalIdx << 3), - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - return; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR8); + + /***** luma component filtering *****/ + // filter the top-left corner 8x8 luma block + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 luma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + (horizontalIdx << 3) - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore( + reconpicture, + reconpicture->strideY, + lcuPos_x + (horizontalIdx << 3), + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 luma block column + for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + (verticalIdx << 3) - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y + (verticalIdx << 3), + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + /***** chroma components filtering *****/ + // filter the top-left corner 8x8 chroma block + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + (chromaLcuSizeY - 4) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + (chromaLcuSizeY - 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 4) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 2) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + 2 >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 2 >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 chroma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + (chromaLcuSizeY - 4) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + (chromaLcuSizeY - 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((horizontalIdx << 3) - 4) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((horizontalIdx << 3) - 2) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + 0, + logMaxLcuSizeIn4x4blk); + + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + 2 >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((horizontalIdx << 3) + 2) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x + (horizontalIdx << 3), + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 chroma block column + for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + ((verticalIdx << 3) - 4) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + ((verticalIdx << 3) - 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 4) >> subWidthShfitMinus1, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 2) >> subWidthShfitMinus1, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + ((verticalIdx << 3) + 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 2 >> subWidthShfitMinus1, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y + (verticalIdx << 3), + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + return; } void LCUBoundaryDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. - EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. - EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. + EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. + EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - // luma variable - EB_U32 edgeABlk4x4Addr; - EB_U32 edgeBBlk4x4Addr; - EB_U32 edgeCBlk4x4Addr; - EB_U32 edgeDBlk4x4Addr; - EB_U8 bSLumaEdgeA; - EB_U8 bSLumaEdgeB; - EB_U8 bSLumaEdgeC; - EB_U8 bSLumaEdgeD; - EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; - EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; - - // chroma variable - EB_U32 edgeAUpperBlk2x2Addr; - EB_U32 edgeALowerBlk2x2Addr; - EB_U32 edgeBLeftBlk2x2Addr; - EB_U32 edgeBRightBlk2x2Addr; - EB_U32 edgeCUpperBlk2x2Addr; - EB_U32 edgeCLowerBlk2x2Addr; - EB_U32 edgeDLeftBlk2x2Addr; - EB_U32 edgeDRightBlk2x2Addr; - EB_U8 bSChromaEdgeA[2]; - EB_U8 bSChromaEdgeB[2]; - EB_U8 bSChromaEdgeC[2]; - EB_U8 bSChromaEdgeD[2]; - - EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; + // luma variable + EB_U32 edgeABlk4x4Addr; + EB_U32 edgeBBlk4x4Addr; + EB_U32 edgeCBlk4x4Addr; + EB_U32 edgeDBlk4x4Addr; + EB_U8 bSLumaEdgeA; + EB_U8 bSLumaEdgeB; + EB_U8 bSLumaEdgeC; + EB_U8 bSLumaEdgeD; + EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; + EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; + + // chroma variable + EB_U32 edgeAUpperBlk2x2Addr; + EB_U32 edgeALowerBlk2x2Addr; + EB_U32 edgeBLeftBlk2x2Addr; + EB_U32 edgeBRightBlk2x2Addr; + EB_U32 edgeCUpperBlk2x2Addr; + EB_U32 edgeCLowerBlk2x2Addr; + EB_U32 edgeDLeftBlk2x2Addr; + EB_U32 edgeDRightBlk2x2Addr; + EB_U8 bSChromaEdgeA[2]; + EB_U8 bSChromaEdgeB[2]; + EB_U8 bSChromaEdgeC[2]; + EB_U8 bSChromaEdgeD[2]; + + EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; EB_U32 chromaLcuPos_x = lcuPos_x >> (colorFormat==EB_YUV444?0:1); EB_U32 chromaLcuPos_y = lcuPos_y >> (colorFormat==EB_YUV420?1:0); - EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); - EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); + EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); + EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); - EB_U32 horizontalIdx; - EB_U32 verticalIdx; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); + EB_U32 horizontalIdx; + EB_U32 verticalIdx; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; EB_U32 chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); EB_U32 chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - /***** luma component filtering *****/ - // filter the top-left corner 8x8 luma block - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 luma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - (horizontalIdx << 3) - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideY, - lcuPos_x + (horizontalIdx << 3), - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 luma block column - for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - (verticalIdx << 3) - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y + (verticalIdx << 3), - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - /***** chroma components filtering *****/ - // filter the top-left corner 8x8 chroma block - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + /***** luma component filtering *****/ + // filter the top-left corner 8x8 luma block + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 luma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + (horizontalIdx << 3) - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideY, + lcuPos_x + (horizontalIdx << 3), + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 luma block column + for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + (verticalIdx << 3) - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y + (verticalIdx << 3), + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + /***** chroma components filtering *****/ + // filter the top-left corner 8x8 chroma block + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); + 0, + logMaxLcuSizeIn4x4blk); - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( 2 >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 chroma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 chroma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((horizontalIdx << 3) - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((horizontalIdx << 3) - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); + 0, + logMaxLcuSizeIn4x4blk); - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), - 0, - logMaxLcuSizeIn4x4blk); + 0, + logMaxLcuSizeIn4x4blk); - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((horizontalIdx << 3) + 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x + (horizontalIdx << 3), - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 chroma block column - for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x + (horizontalIdx << 3), + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 chroma block column + for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, ((verticalIdx << 3) - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, ((verticalIdx << 3) - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 4) >> subWidthShfitMinus1, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 2) >> subWidthShfitMinus1, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, ((verticalIdx << 3) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( 2 >> subWidthShfitMinus1, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y + (verticalIdx << 3), - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - return; + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y + (verticalIdx << 3), + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + return; } /** LCUPictureEdgeDLFCore() is used to apply the deblocking filter on the LCU boundary */ void LCUPictureEdgeDLFCore( - EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuIdx, - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuIdx, + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); - - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U32 num4SampleHorizontalEdges; - EB_U32 num4SampleVerticalEdges; - EB_U32 blk4x4Addr; - EB_U32 blk2x2Addr; - EB_U32 pictureWidthInLcu; - //EB_U32 pictureHeightInLcu; - EB_U32 tileWidthInPxl; - EB_U32 tileHeightInPxl; - EB_U32 tileWidthEndInLcu; - EB_U32 tileHeightEndInLcu; - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U8 bS; - EB_U32 lcuSize; - EB_U32 chromaLcuSizeX; - EB_U32 chromaLcuSizeY; - EB_U8 curCuQp; - EB_BYTE edgeStartFilteredSamplePtr; - EB_BYTE edgeStartSampleCb; - EB_BYTE edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 Beta; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); + + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U32 num4SampleHorizontalEdges; + EB_U32 num4SampleVerticalEdges; + EB_U32 blk4x4Addr; + EB_U32 blk2x2Addr; + EB_U32 pictureWidthInLcu; + //EB_U32 pictureHeightInLcu; + EB_U32 tileWidthInPxl; + EB_U32 tileHeightInPxl; + EB_U32 tileWidthEndInLcu; + EB_U32 tileHeightEndInLcu; + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U8 bS; + EB_U32 lcuSize; + EB_U32 chromaLcuSizeX; + EB_U32 chromaLcuSizeY; + EB_U8 curCuQp; + EB_BYTE edgeStartFilteredSamplePtr; + EB_BYTE edgeStartSampleCb; + EB_BYTE edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 Beta; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //tileWidthEndInLcu = (lcuPtr->tileEndX + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //tileHeightEndInLcu = (lcuPtr->tileEndY + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; - tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; + pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //tileWidthEndInLcu = (lcuPtr->tileEndX + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //tileHeightEndInLcu = (lcuPtr->tileEndY + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; + tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; tileWidthInPxl = lcuPtr->tileInfoPtr->tilePxlEndX - lcuPtr->tileInfoPtr->tilePxlOriginX; - tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; - lcuSize = sequenceControlSet->lcuSize; - chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); - chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); + tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; + lcuSize = sequenceControlSet->lcuSize; + chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); + chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { - /***** picture right-most 4 sample horizontal edges filtering *****/ - // luma component filtering - num4SampleHorizontalEdges = (lcuHeight >> 3); - fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - // edge B - fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position - //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample luma edge filter core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { - num4SampleHorizontalEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) + (((lcuHeight >> (colorFormat==EB_YUV420?1:0)) & (colorFormat==EB_YUV420?7:15)) != 0); - fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location - //for(verticalIdx = 1; verticalIdx <= num4SampleHorizontalEdges; ++verticalIdx) { - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - fourSampleEdgeStartSamplePos_y = (lcuPos_y >> (colorFormat==EB_YUV420?1:0)) + (verticalIdx << 3); // Picture wise location - - // left 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, - (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { + /***** picture right-most 4 sample horizontal edges filtering *****/ + // luma component filtering + num4SampleHorizontalEdges = (lcuHeight >> 3); + fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + // edge B + fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position + //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample luma edge filter core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { + num4SampleHorizontalEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) + (((lcuHeight >> (colorFormat==EB_YUV420?1:0)) & (colorFormat==EB_YUV420?7:15)) != 0); + fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location + //for(verticalIdx = 1; verticalIdx <= num4SampleHorizontalEdges; ++verticalIdx) { + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + fourSampleEdgeStartSamplePos_y = (lcuPos_y >> (colorFormat==EB_YUV420?1:0)) + (verticalIdx << 3); // Picture wise location + + // left 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, + (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - - } - - // right 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) + 2) >> subWidthShfitMinus1, - (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + + } + + // right 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) + 2) >> subWidthShfitMinus1, + (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - } - } - } - } - - if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { - /***** picture bottom 4 sample vertical edges filtering *****/ - // luma component filtering - num4SampleVerticalEdges = (lcuWidth >> 3); - fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position - lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample edge luma filter core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { - num4SampleVerticalEdges = (lcuWidth >> (3+(colorFormat==EB_YUV444?0:1))) + (((lcuWidth >> (colorFormat==EB_YUV444?0:1)) & (colorFormat==EB_YUV444?15:7)) != 0); - - fourSampleEdgeStartSamplePos_y = sequenceControlSet->chromaHeight - 4; // Picture wise location - fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { - fourSampleEdgeStartSamplePos_x = (lcuPos_x >> (colorFormat==EB_YUV444?0:1)) + (horizontalIdx << 3); // Picture wise location - lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize - (colorFormat==EB_YUV420?1:0))) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize - (colorFormat==EB_YUV444?0:1))); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - - // Upper 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, - (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + } + } + } + } + + if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { + /***** picture bottom 4 sample vertical edges filtering *****/ + // luma component filtering + num4SampleVerticalEdges = (lcuWidth >> 3); + fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position + lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample edge luma filter core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { + num4SampleVerticalEdges = (lcuWidth >> (3+(colorFormat==EB_YUV444?0:1))) + (((lcuWidth >> (colorFormat==EB_YUV444?0:1)) & (colorFormat==EB_YUV444?15:7)) != 0); + + fourSampleEdgeStartSamplePos_y = sequenceControlSet->chromaHeight - 4; // Picture wise location + fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + fourSampleEdgeStartSamplePos_x = (lcuPos_x >> (colorFormat==EB_YUV444?0:1)) + (horizontalIdx << 3); // Picture wise location + lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize - (colorFormat==EB_YUV420?1:0))) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize - (colorFormat==EB_YUV444?0:1))); + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + + // Upper 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, + (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - - // Lower 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, - ((fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + + // Lower 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, + ((fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) + 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - } - } - } - return; + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + } + } + } + return; } /** LCUPictureEdgeDLFCore() is used to apply the deblocking filter on the LCU boundary */ void LCUPictureEdgeDLFCore16bit( - EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuIdx, - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuIdx, + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); - - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U32 num4SampleHorizontalEdges; - EB_U32 num4SampleVerticalEdges; - EB_U32 blk4x4Addr; - EB_U32 blk2x2Addr; - EB_U32 pictureWidthInLcu; - //EB_U32 pictureHeightInLcu; - - EB_U32 tileWidthInPxl; - EB_U32 tileHeightInPxl; - EB_U32 tileWidthEndInLcu; - EB_U32 tileHeightEndInLcu; - - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U8 bS; - EB_U32 lcuSize; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); + + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U32 num4SampleHorizontalEdges; + EB_U32 num4SampleVerticalEdges; + EB_U32 blk4x4Addr; + EB_U32 blk2x2Addr; + EB_U32 pictureWidthInLcu; + //EB_U32 pictureHeightInLcu; + + EB_U32 tileWidthInPxl; + EB_U32 tileHeightInPxl; + EB_U32 tileWidthEndInLcu; + EB_U32 tileHeightEndInLcu; + + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U8 bS; + EB_U32 lcuSize; EB_U32 chromaLcuSizeX; EB_U32 chromaLcuSizeY; - EB_U8 curCuQp; - EB_U16 *edgeStartFilteredSamplePtr; - EB_U16 *edgeStartSampleCb; - EB_U16 *edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 Beta; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; + EB_U8 curCuQp; + EB_U16 *edgeStartFilteredSamplePtr; + EB_U16 *edgeStartSampleCb; + EB_U16 *edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 Beta; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; - tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; + pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; + tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; tileWidthInPxl = lcuPtr->tileInfoPtr->tilePxlEndX - lcuPtr->tileInfoPtr->tilePxlOriginX; - tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; + tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; lcuSize = sequenceControlSet->lcuSize; chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); @@ -3990,359 +3990,359 @@ void LCUPictureEdgeDLFCore16bit( const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { - /***** picture right-most 4 sample horizontal edges filtering *****/ - // luma component filtering - num4SampleHorizontalEdges = (lcuHeight >> 3); - fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position - - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - // edge B - //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // picture-wise position - fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position - //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - - lumaTc = lumaTc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample luma edge filter core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { - //num4SampleHorizontalEdges = (sequenceControlSet->chromaHeight >> 3) + ((sequenceControlSet->chromaHeight & 7) != 0) - 1; + if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { + /***** picture right-most 4 sample horizontal edges filtering *****/ + // luma component filtering + num4SampleHorizontalEdges = (lcuHeight >> 3); + fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position + + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + // edge B + //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // picture-wise position + fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position + //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + + lumaTc = lumaTc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample luma edge filter core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { + //num4SampleHorizontalEdges = (sequenceControlSet->chromaHeight >> 3) + ((sequenceControlSet->chromaHeight & 7) != 0) - 1; num4SampleHorizontalEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) + (((lcuHeight >> (colorFormat==EB_YUV420?1:0)) & (colorFormat==EB_YUV420?7:15)) != 0); - fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // Picture wise location + fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // Picture wise location fourSampleEdgeStartSamplePos_y = (lcuPos_y >> (colorFormat==EB_YUV420?1:0)) + (verticalIdx << 3); // Picture wise location - //lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize-1)) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize-1)); - //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + //lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize-1)) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize-1)); + //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - // left 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + // left 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - - } - - // right 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + + } + + // right 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) + 2) >> subWidthShfitMinus1, (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); - edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - } - } - } - } - - if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { - /***** picture bottom 4 sample vertical edges filtering *****/ - // luma component filtering - num4SampleVerticalEdges = (lcuWidth >> 3); - fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position - lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - - lumaTc = lumaTc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample edge luma filter core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); + edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + } + } + } + } + + if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { + /***** picture bottom 4 sample vertical edges filtering *****/ + // luma component filtering + num4SampleVerticalEdges = (lcuWidth >> 3); + fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position + lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + + lumaTc = lumaTc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample edge luma filter core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { num4SampleVerticalEdges = (lcuWidth >> (3+(colorFormat==EB_YUV444?0:1))) + (((lcuWidth >> (colorFormat==EB_YUV444?0:1)) & (colorFormat==EB_YUV444?15:7)) != 0); - //fourSampleEdgeStartSamplePos_y = (lcuPtr->tileEndY >> subHeightCMinus1) - 4; // Tile wise location - fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + //fourSampleEdgeStartSamplePos_y = (lcuPtr->tileEndY >> subHeightCMinus1) - 4; // Tile wise location + fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { fourSampleEdgeStartSamplePos_x = (lcuPos_x >> (colorFormat==EB_YUV444?0:1)) + (horizontalIdx << 3); // Picture wise location lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize - (colorFormat==EB_YUV420?1:0))) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize - (colorFormat==EB_YUV444?0:1))); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - // Upper 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + // Upper 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - - // Lower 2 sample edge + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + + // Lower 2 sample edge blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, ((fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - } - } - } - - return; + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + } + } + } + + return; } diff --git a/Source/Lib/Codec/EbDeblockingFilter.h b/Source/Lib/Codec/EbDeblockingFilter.h index 9ef357ada..65d53392e 100644 --- a/Source/Lib/Codec/EbDeblockingFilter.h +++ b/Source/Lib/Codec/EbDeblockingFilter.h @@ -38,16 +38,16 @@ extern "C" { #define MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET 53 -#define BETA_OFFSET_VALUE 12 // range -12 to 12 +#define BETA_OFFSET_VALUE 12 // range -12 to 12 -#define TC_OFFSET_VALUE 12//12 // range -12 to 12 +#define TC_OFFSET_VALUE 12//12 // range -12 to 12 void SetQpArrayBasedOnCU( - PictureControlSet_t *pictureControlSetPtr, //input parameter - EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU - EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU - EB_U32 cuSizeInMinCuSize, //input parameter - EB_U32 cuQp) ; //input parameter, Qp of the CU + PictureControlSet_t *pictureControlSetPtr, //input parameter + EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU + EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU + EB_U32 cuSizeInMinCuSize, //input parameter + EB_U32 cuQp) ; //input parameter, Qp of the CU extern void entropySetQpArrayBasedOnCU( PictureControlSet_t *pictureControlSetPtr, @@ -64,7 +64,7 @@ extern EB_U8 CalculateBSForPUBoundary( PredictionUnit_t *neighbourPuPtr, EB_MODETYPE puCodingMode, EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, + EB_BOOL isVerticalEdge, PictureControlSet_t *pictureControlSetPtr, SequenceControlSet_t *sequenceControlSetPtr); @@ -104,7 +104,7 @@ extern EB_U8 Intra4x4CalculateBSForPUBoundary( PredictionUnit_t *neighbourPuPtr, EB_MODETYPE puCodingMode, EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, + EB_BOOL isVerticalEdge, EB_BOOL isVerticalPuBoundaryAlsoTuBoundary, EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary, PictureControlSet_t *pictureControlSetPtr, @@ -131,7 +131,7 @@ extern void Intra4x4SetBSArrayBasedOnPUBoundary( PredictionUnit_t *puPtr, CodingUnit_t *cuPtr, const CodedUnitStats_t *cuStatsPtr, - EB_U32 puOriginX, + EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, @@ -145,7 +145,7 @@ extern void Intra4x4SetBSArrayBasedOnPUBoundary( extern EB_ERRORTYPE LCUInternalAreaDLFCore( - EbPictureBufferDesc_t *reconpicture, + EbPictureBufferDesc_t *reconpicture, EB_U32 lcuPosx, EB_U32 lcuPosy, EB_U32 lcuWidth, @@ -155,7 +155,7 @@ extern EB_ERRORTYPE LCUInternalAreaDLFCore( PictureControlSet_t *reconPictureControlSet); extern EB_ERRORTYPE LCUInternalAreaDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, + EbPictureBufferDesc_t *reconpicture, EB_U32 lcuPosx, EB_U32 lcuPosy, EB_U32 lcuWidth, @@ -165,46 +165,46 @@ extern EB_ERRORTYPE LCUInternalAreaDLFCore16bit( PictureControlSet_t *reconPictureControlSet); extern void LCUBoundaryDLFCore( - EbPictureBufferDesc_t *reconpicture, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - EB_U8 *lcuVerticalEdgeBSArray, - EB_U8 *lcuHorizontalEdgeBSArray, - EB_U8 *topLcuVerticalEdgeBSArray, - EB_U8 *leftLcuHorizontalEdgeBSArray, + EbPictureBufferDesc_t *reconpicture, + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + EB_U8 *lcuVerticalEdgeBSArray, + EB_U8 *lcuHorizontalEdgeBSArray, + EB_U8 *topLcuVerticalEdgeBSArray, + EB_U8 *leftLcuHorizontalEdgeBSArray, PictureControlSet_t *pictureControlSetPtr); extern void LCUBoundaryDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - EB_U8 *lcuVerticalEdgeBSArray, - EB_U8 *lcuHorizontalEdgeBSArray, - EB_U8 *topLcuVerticalEdgeBSArray, - EB_U8 *leftLcuHorizontalEdgeBSArray, + EbPictureBufferDesc_t *reconpicture, + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + EB_U8 *lcuVerticalEdgeBSArray, + EB_U8 *lcuHorizontalEdgeBSArray, + EB_U8 *topLcuVerticalEdgeBSArray, + EB_U8 *leftLcuHorizontalEdgeBSArray, PictureControlSet_t *pictureControlSetPtr); extern void LCUPictureEdgeDLFCore( - EbPictureBufferDesc_t *reconPic, + EbPictureBufferDesc_t *reconPic, EB_U32 lcuIdx, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + PictureControlSet_t *pictureControlSetPtr); extern void LCUPictureEdgeDLFCore16bit( - EbPictureBufferDesc_t *reconPic, + EbPictureBufferDesc_t *reconPic, EB_U32 lcuIdx, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + PictureControlSet_t *pictureControlSetPtr); /*************************************** * Function Types @@ -225,8 +225,8 @@ typedef void(*EB_CHROMA2SAMPLEDGEDLF_FUNC)( EB_U8 crTc); typedef void(*EB_CHROMADLF_TYPE_16BIT)( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, @@ -243,8 +243,8 @@ typedef void(*EB_LUMADLF_TYPE_16BIT)( * Function Ptr Types ***************************************/ static EB_LUMA4SAMPLEDGEDLF_FUNC FUNC_TABLE Luma4SampleEdgeDLFCore_Table[EB_ASM_TYPE_TOTAL] = -{ - // C_DEFAULT +{ + // C_DEFAULT Luma4SampleEdgeDLFCore, // AVX2 Luma4SampleEdgeDLFCore_SSSE3, diff --git a/Source/Lib/Codec/EbEncDecProcess.h b/Source/Lib/Codec/EbEncDecProcess.h index 89b25243b..a35d0fdd0 100644 --- a/Source/Lib/Codec/EbEncDecProcess.h +++ b/Source/Lib/Codec/EbEncDecProcess.h @@ -27,13 +27,13 @@ extern "C" { #define PM_STRIDE 4 typedef struct EbPMCand_s { - - EB_S16 trCoeff[4 * 4]; - EB_S16 quCoeff[4 * 4]; - EB_S16 iqCoeff[4 * 4]; - EB_U8 maskingLevel; - EB_U64 cost; - EB_U32 nzCoeff; + + EB_S16 trCoeff[4 * 4]; + EB_S16 quCoeff[4 * 4]; + EB_S16 iqCoeff[4 * 4]; + EB_U8 maskingLevel; + EB_U64 cost; + EB_U32 nzCoeff; } EbPMCand_t; @@ -45,107 +45,107 @@ typedef struct EbPMCand_s typedef struct EncDecContext_s { EbFifo_t *modeDecisionInputFifoPtr; - EbFifo_t *encDecOutputFifoPtr; - EbFifo_t *encDecFeedbackFifoPtr; - EbFifo_t *pictureDemuxOutputFifoPtr; // to picture-manager + EbFifo_t *encDecOutputFifoPtr; + EbFifo_t *encDecFeedbackFifoPtr; + EbFifo_t *pictureDemuxOutputFifoPtr; // to picture-manager - EB_S16 *transformInnerArrayPtr; - MdRateEstimationContext_t *mdRateEstimationPtr; - SaoStats_t *saoStats; + EB_S16 *transformInnerArrayPtr; + MdRateEstimationContext_t *mdRateEstimationPtr; + SaoStats_t *saoStats; ModeDecisionContext_t *mdContext; - // Lambda - EB_U8 qp; - EB_U8 chromaQp; - EB_U32 fastLambda; - EB_U32 fullLambda; - EB_U32 fastChromaLambda; - EB_U32 fullChromaLambda; - EB_U32 fullChromaLambdaSao; + // Lambda + EB_U8 qp; + EB_U8 chromaQp; + EB_U32 fastLambda; + EB_U32 fullLambda; + EB_U32 fastChromaLambda; + EB_U32 fullChromaLambda; + EB_U32 fullChromaLambdaSao; - // TMVP - EbReferenceObject_t *referenceObjectWritePtr; + // TMVP + EbReferenceObject_t *referenceObjectWritePtr; // MCP Context - MotionCompensationPredictionContext_t *mcpContext; + MotionCompensationPredictionContext_t *mcpContext; // Intra Reference Samples - IntraReferenceSamples_t *intraRefPtr; - IntraReference16bitSamples_t *intraRefPtr16; //We need a different buffer for ENC pass then the MD one. - + IntraReferenceSamples_t *intraRefPtr; + IntraReference16bitSamples_t *intraRefPtr16; //We need a different buffer for ENC pass then the MD one. + - // Coding Unit Workspace--------------------------- - EbPictureBufferDesc_t *residualBuffer; - EbPictureBufferDesc_t *transformBuffer; + // Coding Unit Workspace--------------------------- + EbPictureBufferDesc_t *residualBuffer; + EbPictureBufferDesc_t *transformBuffer; EbPictureBufferDesc_t *inputSamples; - EbPictureBufferDesc_t *inputSample16bitBuffer; + EbPictureBufferDesc_t *inputSample16bitBuffer; - // Context Variables--------------------------------- - CodingUnit_t *cuPtr; - const CodedUnitStats_t *cuStats; + // Context Variables--------------------------------- + CodingUnit_t *cuPtr; + const CodedUnitStats_t *cuStats; EB_U16 cuOriginX; // within the picture - EB_U16 cuOriginY; // within the picture + EB_U16 cuOriginY; // within the picture - EB_U8 lcuSize; + EB_U8 lcuSize; EB_U32 lcuIndex; - EB_U16 cuChromaOriginX; - EB_U16 cuChromaOriginY; + EB_U16 cuChromaOriginX; + EB_U16 cuChromaOriginY; - MvUnit_t mvUnit; - EB_U8 amvpCandidateCountRefList0; - EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_U8 amvpCandidateCountRefList1; - EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; + MvUnit_t mvUnit; + EB_U8 amvpCandidateCountRefList0; + EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_U8 amvpCandidateCountRefList1; + EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_U8 tuItr; - EB_BOOL is16bit; //enable 10 bit encode in CL + EB_U8 tuItr; + EB_BOOL is16bit; //enable 10 bit encode in CL EB_COLOR_FORMAT colorFormat; - // SAO application - EB_U8 *saoUpBuffer[2]; - EB_U8 *saoLeftBuffer[2]; - EB_U16 *saoUpBuffer16[2]; - EB_U16 *saoLeftBuffer16[2]; + // SAO application + EB_U8 *saoUpBuffer[2]; + EB_U8 *saoLeftBuffer[2]; + EB_U16 *saoUpBuffer16[2]; + EB_U16 *saoLeftBuffer16[2]; - EB_U64 totIntraCodedArea; + EB_U64 totIntraCodedArea; EB_U32 codedLcuCount; - EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% - EB_U8 cleanSparseCeoffPfEncDec; - EB_U8 pmpMaskingLevelEncDec; - EB_U8 forceCbfFlag; + EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% + EB_U8 cleanSparseCeoffPfEncDec; + EB_U8 pmpMaskingLevelEncDec; + EB_U8 forceCbfFlag; + + EB_BOOL skipQpmFlag; - EB_BOOL skipQpmFlag; - - EB_S16 minDeltaQpWeight; - EB_S16 maxDeltaQpWeight; - EB_S8 minDeltaQp[4]; - EB_S8 maxDeltaQp[4]; - EB_S8 nonMovingDeltaQp; + EB_S16 minDeltaQpWeight; + EB_S16 maxDeltaQpWeight; + EB_S8 minDeltaQp[4]; + EB_S8 maxDeltaQp[4]; + EB_S8 nonMovingDeltaQp; - EB_BOOL grassEnhancementFlag; - EB_BOOL backgorundEnhancement; - EB_U8 qpmQp; + EB_BOOL grassEnhancementFlag; + EB_BOOL backgorundEnhancement; + EB_U8 qpmQp; EB_TRANS_COEFF_SHAPE transCoeffShapeLuma; EB_TRANS_COEFF_SHAPE transCoeffShapeChroma; - - EbPMCand_t pmCandBuffer[5]; + + EbPMCand_t pmCandBuffer[5]; // Multi-modes signal(s) EB_BOOL allowEncDecMismatch; EB_BOOL fastEl; - EB_U32 yBitsThsld; + EB_U32 yBitsThsld; EB_U8 saoMode; - EB_PM_MODE pmMode; // agressive vs. conservative - EB_BOOL pmMethod; // 1-stgae vs. 2-stage + EB_PM_MODE pmMode; // agressive vs. conservative + EB_BOOL pmMethod; // 1-stgae vs. 2-stage EB_U16 tileRowIndex; EB_U16 tileIndex; @@ -165,9 +165,9 @@ extern EB_ERRORTYPE EncDecContextCtor( EB_COLOR_FORMAT colorFormat); - + extern void* EncDecKernel(void *inputPtr); #ifdef __cplusplus } -#endif +#endif #endif // EbEncDecProcess_h diff --git a/Source/Lib/Codec/EbEncDecResults.c b/Source/Lib/Codec/EbEncDecResults.c index 0b1875c36..91be6b2a9 100644 --- a/Source/Lib/Codec/EbEncDecResults.c +++ b/Source/Lib/Codec/EbEncDecResults.c @@ -13,7 +13,7 @@ EB_ERRORTYPE EncDecResultsCtor( { EncDecResults_t *contextPtr; EB_MALLOC(EncDecResults_t*, contextPtr, sizeof(EncDecResults_t), EB_N_PTR); - + *objectDblPtr = (EB_PTR) contextPtr; (void) objectInitDataPtr; diff --git a/Source/Lib/Codec/EbEncDecResults.h b/Source/Lib/Codec/EbEncDecResults.h index 5c5ba8556..5da427bab 100644 --- a/Source/Lib/Codec/EbEncDecResults.h +++ b/Source/Lib/Codec/EbEncDecResults.h @@ -14,7 +14,7 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct EncDecResults_s +typedef struct EncDecResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; EB_U32 completedLcuRowIndexStart; @@ -32,7 +32,7 @@ typedef struct EncDecResultsInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EncDecResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbEncDecSegments.c b/Source/Lib/Codec/EbEncDecSegments.c index 5edd0d384..f88bc16b4 100644 --- a/Source/Lib/Codec/EbEncDecSegments.c +++ b/Source/Lib/Codec/EbEncDecSegments.c @@ -18,7 +18,7 @@ EB_ERRORTYPE EncDecSegmentsCtor( EB_U32 rowIndex; EncDecSegments_t *segmentsPtr; EB_MALLOC(EncDecSegments_t*, segmentsPtr, sizeof(EncDecSegments_t), EB_N_PTR); - + *segmentsDblPtr = segmentsPtr; segmentsPtr->segmentMaxRowCount = segmentRowCount; @@ -29,17 +29,17 @@ EB_ERRORTYPE EncDecSegmentsCtor( EB_MALLOC(EB_U16*, segmentsPtr->xStartArray, sizeof(EB_U16) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); EB_MALLOC(EB_U16*, segmentsPtr->yStartArray, sizeof(EB_U16) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); - + EB_MALLOC(EB_U16*, segmentsPtr->validLcuCountArray, sizeof(EB_U16) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); - + // Dependency map EB_MALLOC(EB_U8*, segmentsPtr->depMap.dependencyMap, sizeof(EB_U8) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); - + EB_CREATEMUTEX(EB_HANDLE, segmentsPtr->depMap.updateMutex, sizeof(EB_HANDLE), EB_MUTEX); - + // Segment rows EB_MALLOC(EncDecSegSegmentRow_t*, segmentsPtr->rowArray, sizeof(EncDecSegSegmentRow_t) * segmentsPtr->segmentMaxRowCount, EB_N_PTR) - + for(rowIndex=0; rowIndex < segmentsPtr->segmentMaxRowCount; ++rowIndex) { EB_CREATEMUTEX(EB_HANDLE, segmentsPtr->rowArray[rowIndex].assignmentMutex, sizeof(EB_HANDLE), EB_MUTEX); } @@ -81,12 +81,12 @@ void EncDecSegmentsInit( //++segmentsPtr->inputMap.inputDependencyMap[segmentIndex]; ++segmentsPtr->validLcuCountArray[segmentIndex]; - segmentsPtr->xStartArray[segmentIndex] = (segmentsPtr->xStartArray[segmentIndex] == (EB_U16) -1) ? - (EB_U16) x : + segmentsPtr->xStartArray[segmentIndex] = (segmentsPtr->xStartArray[segmentIndex] == (EB_U16) -1) ? + (EB_U16) x : segmentsPtr->xStartArray[segmentIndex]; - segmentsPtr->yStartArray[segmentIndex] = (segmentsPtr->yStartArray[segmentIndex] == (EB_U16) -1) ? - (EB_U16) y : - segmentsPtr->yStartArray[segmentIndex]; + segmentsPtr->yStartArray[segmentIndex] = (segmentsPtr->yStartArray[segmentIndex] == (EB_U16) -1) ? + (EB_U16) y : + segmentsPtr->yStartArray[segmentIndex]; } } diff --git a/Source/Lib/Codec/EbEncDecSegments.h b/Source/Lib/Codec/EbEncDecSegments.h index 627591fc1..d69472a9e 100644 --- a/Source/Lib/Codec/EbEncDecSegments.h +++ b/Source/Lib/Codec/EbEncDecSegments.h @@ -37,14 +37,14 @@ extern "C" { **************************************/ typedef struct { EB_U8 *dependencyMap; - EB_HANDLE updateMutex; + EB_HANDLE updateMutex; } EncDecSegDependencyMap_t; typedef struct { EB_U16 startingSegIndex; EB_U16 endingSegIndex; EB_U16 currentSegIndex; - EB_HANDLE assignmentMutex; + EB_HANDLE assignmentMutex; } EncDecSegSegmentRow_t; /************************************** @@ -64,7 +64,7 @@ typedef struct EB_U32 segmentTotalCount; EB_U32 lcuBandCount; EB_U32 lcuRowCount; - + EB_U32 segmentMaxBandCount; EB_U32 segmentMaxRowCount; EB_U32 segmentMaxTotalCount; @@ -89,4 +89,4 @@ extern void EncDecSegmentsInit( #ifdef __cplusplus } #endif -#endif // EbEncDecResults_h \ No newline at end of file +#endif // EbEncDecResults_h diff --git a/Source/Lib/Codec/EbEncDecTasks.c b/Source/Lib/Codec/EbEncDecTasks.c index 2b0d1eb43..2bebd8283 100644 --- a/Source/Lib/Codec/EbEncDecTasks.c +++ b/Source/Lib/Codec/EbEncDecTasks.c @@ -14,7 +14,7 @@ EB_ERRORTYPE EncDecTasksCtor( { EncDecTasks_t *contextPtr; EB_MALLOC(EncDecTasks_t*, contextPtr, sizeof(EncDecTasks_t), EB_N_PTR); - + *objectDblPtr = (EB_PTR) contextPtr; (void) objectInitDataPtr; diff --git a/Source/Lib/Codec/EbEncDecTasks.h b/Source/Lib/Codec/EbEncDecTasks.h index 7c9419f95..d49b616a4 100644 --- a/Source/Lib/Codec/EbEncDecTasks.h +++ b/Source/Lib/Codec/EbEncDecTasks.h @@ -18,7 +18,7 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct EncDecTasks_s +typedef struct EncDecTasks_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; EB_U32 inputType; @@ -36,7 +36,7 @@ typedef struct EncDecTasksInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EncDecTasksCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbEncHandle.h b/Source/Lib/Codec/EbEncHandle.h index 199a1312f..2803046a5 100644 --- a/Source/Lib/Codec/EbEncHandle.h +++ b/Source/Lib/Codec/EbEncHandle.h @@ -21,46 +21,46 @@ extern "C" { #endif /************************************** * Component Private Data - **************************************/ + **************************************/ typedef struct EbEncHandle_s { // Encode Instances & Compute Segments EB_U32 encodeInstanceTotalCount; EB_U32 *computeSegmentsTotalCountArray; - + // Config Set Counts - EB_U32 sequenceControlSetPoolTotalCount; - + EB_U32 sequenceControlSetPoolTotalCount; + // Full Results Count - EB_U32 pictureControlSetPoolTotalCount; - + EB_U32 pictureControlSetPoolTotalCount; + // Picture Buffer Counts EB_U32 reconPicturePoolTotalCount; EB_U32 coeffPicturePoolTotalCount; EB_U32 referencePicturePoolTotalCount; EB_U32 paReferencePicturPooleBufferInitCount; - + // Config Set Pool & Active Array EbSystemResource_t *sequenceControlSetPoolPtr; EbFifo_t **sequenceControlSetPoolProducerFifoPtrArray; EbSequenceControlSetInstance_t **sequenceControlSetInstanceArray; - - // Full Results + + // Full Results EbSystemResource_t **pictureControlSetPoolPtrArray; EbFifo_t ***pictureControlSetPoolProducerFifoPtrDblArray; //ParentControlSet EbSystemResource_t **pictureParentControlSetPoolPtrArray; EbFifo_t ***pictureParentControlSetPoolProducerFifoPtrDblArray; - + // Picture Buffers EbSystemResource_t **referencePicturePoolPtrArray; EbSystemResource_t **paReferencePicturePoolPtrArray; - - // Picture Buffer Producer Fifos + + // Picture Buffer Producer Fifos EbFifo_t ***referencePicturePoolProducerFifoPtrDblArray; EbFifo_t ***paReferencePicturePoolProducerFifoPtrDblArray; - + // Thread Handles EB_HANDLE resourceCoordinationThreadHandle; EB_HANDLE pictureEnhancementThreadHandle; @@ -68,14 +68,14 @@ typedef struct EbEncHandle_s EB_HANDLE pictureDecisionThreadHandle; EB_HANDLE *motionEstimationThreadHandleArray; EB_HANDLE initialRateControlThreadHandle; - EB_HANDLE *sourceBasedOperationsThreadHandleArray; + EB_HANDLE *sourceBasedOperationsThreadHandleArray; EB_HANDLE pictureManagerThreadHandle; EB_HANDLE rateControlThreadHandle; EB_HANDLE *modeDecisionConfigurationThreadHandleArray; EB_HANDLE *encDecThreadHandleArray; EB_HANDLE *entropyCodingThreadHandleArray; EB_HANDLE packetizationThreadHandle; - + // Contexts EB_PTR resourceCoordinationContextPtr; EB_PTR pictureEnhancementContextPtr; @@ -83,14 +83,14 @@ typedef struct EbEncHandle_s EB_PTR pictureDecisionContextPtr; EB_PTR *motionEstimationContextPtrArray; EB_PTR initialRateControlContextPtr; - EB_PTR *sourceBasedOperationsContextPtrArray; + EB_PTR *sourceBasedOperationsContextPtrArray; EB_PTR pictureManagerContextPtr; EB_PTR rateControlContextPtr; EB_PTR *modeDecisionConfigurationContextPtrArray; EB_PTR *encDecContextPtrArray; EB_PTR *entropyCodingContextPtrArray; EB_PTR packetizationContextPtr; - + // System Resource Managers EbSystemResource_t *inputBufferResourcePtr; EbSystemResource_t **outputStreamBufferResourcePtrArray; @@ -99,14 +99,14 @@ typedef struct EbEncHandle_s EbSystemResource_t *pictureAnalysisResultsResourcePtr; EbSystemResource_t *pictureDecisionResultsResourcePtr; EbSystemResource_t *motionEstimationResultsResourcePtr; - EbSystemResource_t *initialRateControlResultsResourcePtr; + EbSystemResource_t *initialRateControlResultsResourcePtr; EbSystemResource_t *pictureDemuxResultsResourcePtr; EbSystemResource_t *rateControlTasksResourcePtr; EbSystemResource_t *rateControlResultsResourcePtr; EbSystemResource_t *encDecTasksResourcePtr; EbSystemResource_t *encDecResultsResourcePtr; EbSystemResource_t *entropyCodingResultsResourcePtr; - + // Inter-Process Producer Fifos EbFifo_t **inputBufferProducerFifoPtrArray; EbFifo_t ***outputStreamBufferProducerFifoPtrDblArray; @@ -123,7 +123,7 @@ typedef struct EbEncHandle_s EbFifo_t **encDecTasksProducerFifoPtrArray; EbFifo_t **encDecResultsProducerFifoPtrArray; EbFifo_t **entropyCodingResultsProducerFifoPtrArray; - + // Inter-Process Consumer Fifos EbFifo_t **inputBufferConsumerFifoPtrArray; EbFifo_t ***outputStreamBufferConsumerFifoPtrDblArray; @@ -139,22 +139,22 @@ typedef struct EbEncHandle_s EbFifo_t **encDecTasksConsumerFifoPtrArray; EbFifo_t **encDecResultsConsumerFifoPtrArray; EbFifo_t **entropyCodingResultsConsumerFifoPtrArray; - + // Callbacks EbCallback_t **appCallbackPtrArray; - + // Input Video Ports EB_PARAM_PORTDEFINITIONTYPE **inputVideoPortPtrArray; - + // Output Bitstream Port EB_PARAM_PORTDEFINITIONTYPE **outputStreamPortPtrArray; - + // Output Recon Video Port - // *Note - Recon Video buffers will have distortion data appended to + // *Note - Recon Video buffers will have distortion data appended to // the end of the buffer. This distortion data aids in the calculation // of PSNR. // Memory Map - EbMemoryMapEntry *memoryMap; + EbMemoryMapEntry *memoryMap; EB_U32 memoryMapIndex; EB_U64 totalLibMemory; @@ -162,9 +162,9 @@ typedef struct EbEncHandle_s /************************************** * EB_BUFFERHEADERTYPE Constructor - **************************************/ + **************************************/ extern EB_ERRORTYPE EbInputBufferHeaderCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE EbOutputBufferHeaderCtor( @@ -178,4 +178,4 @@ extern EB_ERRORTYPE EbOutputReconBufferHeaderCtor( #ifdef __cplusplus } #endif -#endif // EbEncHandle_h \ No newline at end of file +#endif // EbEncHandle_h diff --git a/Source/Lib/Codec/EbEncodeContext.c b/Source/Lib/Codec/EbEncodeContext.c index edbab3b20..ac52e868e 100644 --- a/Source/Lib/Codec/EbEncodeContext.c +++ b/Source/Lib/Codec/EbEncodeContext.c @@ -13,64 +13,64 @@ #include "EbErrorHandling.h" EB_ERRORTYPE EncodeContextCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { EB_U32 pictureIndex; EB_ERRORTYPE return_error = EB_ErrorNone; - + EncodeContext_t *encodeContextPtr; EB_MALLOC(EncodeContext_t*, encodeContextPtr, sizeof(EncodeContext_t), EB_N_PTR); *objectDblPtr = (EB_PTR) encodeContextPtr; - + objectInitDataPtr = 0; CHECK_REPORT_ERROR( - (objectInitDataPtr == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR29); + (objectInitDataPtr == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR29); // Callback Functions encodeContextPtr->appCallbackPtr = (EbCallback_t*) EB_NULL; - + // Port Active State EB_CREATEMUTEX(EB_HANDLE, encodeContextPtr->terminatingConditionsMutex, sizeof(EB_HANDLE), EB_MUTEX); encodeContextPtr->totalNumberOfReconFrames = 0; - - + + // Output Buffer Fifos encodeContextPtr->streamOutputFifoPtr = (EbFifo_t*) EB_NULL; - + // Picture Buffer Fifos encodeContextPtr->inputPicturePoolFifoPtr = (EbFifo_t*) EB_NULL; - encodeContextPtr->referencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; - encodeContextPtr->paReferencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; - + encodeContextPtr->referencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; + encodeContextPtr->paReferencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; + // Picture Decision Reordering Queue encodeContextPtr->pictureDecisionReorderQueueHeadIndex = 0; EB_MALLOC(PictureDecisionReorderEntry_t**, encodeContextPtr->pictureDecisionReorderQueue, sizeof(PictureDecisionReorderEntry_t*) * PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { - return_error = PictureDecisionReorderEntryCtor( + return_error = PictureDecisionReorderEntryCtor( &(encodeContextPtr->pictureDecisionReorderQueue[pictureIndex]), pictureIndex); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } - - // Picture Manager Reordering Queue - encodeContextPtr->pictureManagerReorderQueueHeadIndex = 0; - EB_MALLOC(PictureManagerReorderEntry_t**, encodeContextPtr->pictureManagerReorderQueue, sizeof(PictureManagerReorderEntry_t*) * PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - for (pictureIndex = 0; pictureIndex < PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { - return_error = PictureManagerReorderEntryCtor( - &(encodeContextPtr->pictureManagerReorderQueue[pictureIndex]), - pictureIndex); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - } + // Picture Manager Reordering Queue + encodeContextPtr->pictureManagerReorderQueueHeadIndex = 0; + EB_MALLOC(PictureManagerReorderEntry_t**, encodeContextPtr->pictureManagerReorderQueue, sizeof(PictureManagerReorderEntry_t*) * PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); + + for (pictureIndex = 0; pictureIndex < PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { + return_error = PictureManagerReorderEntryCtor( + &(encodeContextPtr->pictureManagerReorderQueue[pictureIndex]), + pictureIndex); + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + } // Picture Manager Pre-Assignment Buffer @@ -85,7 +85,7 @@ EB_ERRORTYPE EncodeContextCtor( encodeContextPtr->numberOfActivePictures = 0; EB_MALLOC(EbObjectWrapper_t**, encodeContextPtr->preAssignmentBuffer, sizeof(EbObjectWrapper_t*) * PRE_ASSIGNMENT_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < PRE_ASSIGNMENT_MAX_DEPTH; ++pictureIndex) { encodeContextPtr->preAssignmentBuffer[pictureIndex] = (EbObjectWrapper_t*) EB_NULL; } @@ -102,12 +102,12 @@ EB_ERRORTYPE EncodeContextCtor( return EB_ErrorInsufficientResources; } } - + // Picture Manager Reference Queue encodeContextPtr->referencePictureQueueHeadIndex = 0; encodeContextPtr->referencePictureQueueTailIndex = 0; EB_MALLOC(ReferenceQueueEntry_t**, encodeContextPtr->referencePictureQueue, sizeof(ReferenceQueueEntry_t*) * REFERENCE_QUEUE_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < REFERENCE_QUEUE_MAX_DEPTH; ++pictureIndex) { return_error = ReferenceQueueEntryCtor( &(encodeContextPtr->referencePictureQueue[pictureIndex])); @@ -115,25 +115,25 @@ EB_ERRORTYPE EncodeContextCtor( return EB_ErrorInsufficientResources; } } - + // Picture Decision PA Reference Queue encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex = 0; encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex = 0; EB_MALLOC(PaReferenceQueueEntry_t**, encodeContextPtr->pictureDecisionPaReferenceQueue, sizeof(PaReferenceQueueEntry_t*) * PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH, EB_N_PTR); for(pictureIndex=0; pictureIndex < PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH; ++pictureIndex) { - return_error = PaReferenceQueueEntryCtor( + return_error = PaReferenceQueueEntryCtor( &(encodeContextPtr->pictureDecisionPaReferenceQueue[pictureIndex])); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } - + // Initial Rate Control Reordering Queue encodeContextPtr->initialRateControlReorderQueueHeadIndex = 0; EB_MALLOC(InitialRateControlReorderEntry_t**, encodeContextPtr->initialRateControlReorderQueue, sizeof(InitialRateControlReorderEntry_t*) * INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - for(pictureIndex=0; pictureIndex < INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { + for(pictureIndex=0; pictureIndex < INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { return_error = InitialRateControlReorderEntryCtor( &(encodeContextPtr->initialRateControlReorderQueue[pictureIndex]), pictureIndex); @@ -144,7 +144,7 @@ EB_ERRORTYPE EncodeContextCtor( // High level Rate Control histogram Queue encodeContextPtr->hlRateControlHistorgramQueueHeadIndex = 0; - + EB_CALLOC(HlRateControlHistogramEntry_t**, encodeContextPtr->hlRateControlHistorgramQueue, sizeof(HlRateControlHistogramEntry_t*) * HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH, 1, EB_N_PTR); for(pictureIndex=0; pictureIndex < HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH; ++pictureIndex) { @@ -161,7 +161,7 @@ EB_ERRORTYPE EncodeContextCtor( // Packetization Reordering Queue encodeContextPtr->packetizationReorderQueueHeadIndex = 0; EB_MALLOC(PacketizationReorderEntry_t**, encodeContextPtr->packetizationReorderQueue, sizeof(PacketizationReorderEntry_t*) * PACKETIZATION_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < PACKETIZATION_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { return_error = PacketizationReorderEntryCtor( &(encodeContextPtr->packetizationReorderQueue[pictureIndex]), @@ -170,7 +170,7 @@ EB_ERRORTYPE EncodeContextCtor( return EB_ErrorInsufficientResources; } } - + encodeContextPtr->intraPeriodPosition = 0; encodeContextPtr->predStructPosition = 0; encodeContextPtr->currentInputPoc = -1; @@ -234,12 +234,12 @@ EB_ERRORTYPE EncodeContextCtor( encodeContextPtr->maxCodedPocSelectedRefQp = 32; encodeContextPtr->sharedReferenceMutex = EbCreateMutex(); - if (encodeContextPtr->sharedReferenceMutex == (EB_HANDLE) EB_NULL){ + if (encodeContextPtr->sharedReferenceMutex == (EB_HANDLE) EB_NULL){ return EB_ErrorInsufficientResources; }else { memoryMap[*(memoryMapIndex)].ptrType = EB_MUTEX; memoryMap[(*(memoryMapIndex))++].ptr = encodeContextPtr->sharedReferenceMutex ; - *totalLibMemory += (sizeof(EB_HANDLE)); + *totalLibMemory += (sizeof(EB_HANDLE)); } diff --git a/Source/Lib/Codec/EbEncodeContext.h b/Source/Lib/Codec/EbEncodeContext.h index ec06c4111..dabba4621 100644 --- a/Source/Lib/Codec/EbEncodeContext.h +++ b/Source/Lib/Codec/EbEncodeContext.h @@ -38,13 +38,13 @@ extern "C" { #define HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH 2048 #define PACKETIZATION_REORDER_QUEUE_MAX_DEPTH 2048 -// RC Groups: They should be a power of 2, so we can replace % by &. +// RC Groups: They should be a power of 2, so we can replace % by &. // Instead of using x % y, we use x && (y-1) -#define PARALLEL_GOP_MAX_NUMBER 256 +#define PARALLEL_GOP_MAX_NUMBER 256 #define RC_GROUP_IN_GOP_MAX_NUMBER 512 #define PICTURE_IN_RC_GROUP_MAX_NUMBER 64 -typedef struct EncodeContext_s +typedef struct EncodeContext_s { // Callback Functions EbCallback_t *appCallbackPtr; @@ -55,19 +55,19 @@ typedef struct EncodeContext_s // Output Buffer Fifos EbFifo_t *streamOutputFifoPtr; EbFifo_t *reconOutputFifoPtr; - + // Picture Buffer Fifos EbFifo_t *inputPicturePoolFifoPtr; EbFifo_t *referencePicturePoolFifoPtr; EbFifo_t *paReferencePicturePoolFifoPtr; - + // Picture Decision Reorder Queue PictureDecisionReorderEntry_t **pictureDecisionReorderQueue; EB_U32 pictureDecisionReorderQueueHeadIndex; - - // Picture Manager Reorder Queue - PictureManagerReorderEntry_t **pictureManagerReorderQueue; - EB_U32 pictureManagerReorderQueueHeadIndex; + + // Picture Manager Reorder Queue + PictureManagerReorderEntry_t **pictureManagerReorderQueue; + EB_U32 pictureManagerReorderQueueHeadIndex; // Picture Manager Pre-Assignment Buffer EB_U32 preAssignmentBufferIntraCount; @@ -76,7 +76,7 @@ typedef struct EncodeContext_s EB_U32 preAssignmentBufferSceneChangeIndex; EB_U32 preAssignmentBufferEosFlag; EB_U64 decodeBaseNumber; - + EbObjectWrapper_t **preAssignmentBuffer; EB_U32 preAssignmentBufferCount; EB_U32 numberOfActivePictures; @@ -94,7 +94,7 @@ typedef struct EncodeContext_s ReferenceQueueEntry_t **referencePictureQueue; EB_U32 referencePictureQueueHeadIndex; EB_U32 referencePictureQueueTailIndex; - + // Initial Rate Control Reorder Queue InitialRateControlReorderEntry_t **initialRateControlReorderQueue; EB_U32 initialRateControlReorderQueueHeadIndex; @@ -107,7 +107,7 @@ typedef struct EncodeContext_s // Packetization Reorder Queue PacketizationReorderEntry_t **packetizationReorderQueue; EB_U32 packetizationReorderQueueHeadIndex; - + // GOP Counters EB_U32 intraPeriodPosition; // Current position in intra period EB_U32 predStructPosition; // Current position within a prediction structure @@ -119,14 +119,14 @@ typedef struct EncodeContext_s EB_U64 lastIdrPicture; // the most recently occured IDR picture (in decode order) // Sequence Termination Flags - EB_U64 terminatingPictureNumber; - EB_BOOL terminatingSequenceFlagReceived; + EB_U64 terminatingPictureNumber; + EB_BOOL terminatingSequenceFlagReceived; // Prediction Structure PredictionStructureGroup_t *predictionStructureGroupPtr; - + // Cabac Context Model Array - ContextModelEncContext_t *cabacContextModelArray; + ContextModelEncContext_t *cabacContextModelArray; // MD Rate Estimation Table MdRateEstimationContext_t *mdRateEstimationArray; @@ -142,7 +142,7 @@ typedef struct EncodeContext_s EB_S64 scFrameOut; EB_HANDLE scBufferMutex; - EB_ENC_MODE encMode; + EB_ENC_MODE encMode; // Rate Control EB_U32 availableTargetBitRate; @@ -153,15 +153,15 @@ typedef struct EncodeContext_s EB_S64 fillerBitError; EB_HANDLE bufferFillMutex; - EB_U32 previousSelectedRefQp; - EB_U64 maxCodedPoc; - EB_U32 maxCodedPocSelectedRefQp; + EB_U32 previousSelectedRefQp; + EB_U64 maxCodedPoc; + EB_U32 maxCodedPocSelectedRefQp; - // Dynamic GOP - EB_U32 previousMiniGopHierarchicalLevels; + // Dynamic GOP + EB_U32 previousMiniGopHierarchicalLevels; - EbObjectWrapper_t *previousPictureControlSetWrapperPtr; - EB_HANDLE sharedReferenceMutex; + EbObjectWrapper_t *previousPictureControlSetWrapperPtr; + EB_HANDLE sharedReferenceMutex; } EncodeContext_t; @@ -174,10 +174,10 @@ typedef struct EncodeContextInitData_s { * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EncodeContextCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + #ifdef __cplusplus } #endif -#endif // EbEncodeContext_h \ No newline at end of file +#endif // EbEncodeContext_h diff --git a/Source/Lib/Codec/EbEntropyCodingObject.h b/Source/Lib/Codec/EbEntropyCodingObject.h index d212de73e..72663309c 100644 --- a/Source/Lib/Codec/EbEntropyCodingObject.h +++ b/Source/Lib/Codec/EbEntropyCodingObject.h @@ -35,4 +35,4 @@ extern EB_PTR EntropyCoderGetBitstreamPtr( #ifdef __cplusplus } #endif -#endif // EbEntropyCodingObject_h \ No newline at end of file +#endif // EbEntropyCodingObject_h diff --git a/Source/Lib/Codec/EbEntropyCodingProcess.h b/Source/Lib/Codec/EbEntropyCodingProcess.h index 0380f7ef2..e53e45d6f 100644 --- a/Source/Lib/Codec/EbEntropyCodingProcess.h +++ b/Source/Lib/Codec/EbEntropyCodingProcess.h @@ -25,16 +25,16 @@ extern "C" { /************************************** * Enc Dec Context **************************************/ -typedef struct EntropyCodingContext_s +typedef struct EntropyCodingContext_s { EbFifo_t *encDecInputFifoPtr; EbFifo_t *entropyCodingOutputFifoPtr; // to packetization EbFifo_t *rateControlOutputFifoPtr; // feedback to rate control - EB_U32 lcuTotalCount; - // Lambda - EB_U8 qp; - EB_U8 chromaQp; + EB_U32 lcuTotalCount; + // Lambda + EB_U8 qp; + EB_U8 chromaQp; // Coding Unit Workspace--------------------------- EbPictureBufferDesc_t *coeffBufferTB; //Used to hold quantized coeff for one TB in EncPass. @@ -43,13 +43,13 @@ typedef struct EntropyCodingContext_s CodingUnit_t *cuPtr; const CodedUnitStats_t *cuStats; EB_U32 cuIndex; - EB_U8 cuDepth; - EB_U32 cuSize; - EB_U32 lcuSize; - EB_U32 lcuChromaSize; + EB_U8 cuDepth; + EB_U32 cuSize; + EB_U32 lcuSize; + EB_U32 lcuChromaSize; EB_U32 cuSizeLog2; - EB_U32 cuOriginX; - EB_U32 cuOriginY; + EB_U32 cuOriginX; + EB_U32 cuOriginY; EB_U32 cuChromaOriginX; EB_U32 cuChromaOriginY; @@ -69,17 +69,17 @@ typedef struct EntropyCodingContext_s EB_U32 amvpCandidateCountRefList1; EB_S32 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; EB_S32 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - + EB_U32 tuItr; EB_U32 tuArea; EB_U32 tuTotalArea; TransformUnit_t *tuPtr; const TransformUnitStats_t *tuStats; - EB_U32 tuOriginX; - EB_U32 tuOriginY; + EB_U32 tuOriginX; + EB_U32 tuOriginY; EB_U32 tuSize; EB_U32 tuSizeChroma; - + // MCP Context EB_BOOL is16bit; //enable 10 bit encode in CL @@ -94,7 +94,7 @@ extern EB_ERRORTYPE EntropyCodingContextCtor( EbFifo_t *packetizationOutputFifoPtr, EbFifo_t *rateControlOutputFifoPtr, EB_BOOL is16bit); - + extern void* EntropyCodingKernel(void *inputPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbEntropyCodingResults.h b/Source/Lib/Codec/EbEntropyCodingResults.h index 634fd6e96..b97897f56 100644 --- a/Source/Lib/Codec/EbEntropyCodingResults.h +++ b/Source/Lib/Codec/EbEntropyCodingResults.h @@ -14,13 +14,13 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct +typedef struct { EbObjectWrapper_t *pictureControlSetWrapperPtr; } EntropyCodingResults_t; -typedef struct +typedef struct { EB_U32 junk; } EntropyCodingResultsInitData_t; @@ -29,11 +29,11 @@ typedef struct * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EntropyCodingResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus } #endif -#endif // EbEntropyCodingResults_h \ No newline at end of file +#endif // EbEntropyCodingResults_h diff --git a/Source/Lib/Codec/EbEntropyCodingUtil.c b/Source/Lib/Codec/EbEntropyCodingUtil.c index 45657a2ae..0e87dee1e 100644 --- a/Source/Lib/Codec/EbEntropyCodingUtil.c +++ b/Source/Lib/Codec/EbEntropyCodingUtil.c @@ -8,8 +8,8 @@ #define ONE_BIT 32768 -//LUT used for LPSxRange calculation -//8 bit unsigned is enough. +//LUT used for LPSxRange calculation +//8 bit unsigned is enough. static const EB_U32 RangeLPSTable1D[] = { 128, 176, 208, 240, @@ -288,8 +288,8 @@ void BacEncContextTerminate( } void RemainingCoeffExponentialGolombCode( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 symbolValue, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 symbolValue, EB_U32 golombParam) { EB_S32 codeWord = symbolValue >> golombParam; diff --git a/Source/Lib/Codec/EbEntropyCodingUtil.h b/Source/Lib/Codec/EbEntropyCodingUtil.h index e14094564..c79bc599b 100644 --- a/Source/Lib/Codec/EbEntropyCodingUtil.h +++ b/Source/Lib/Codec/EbEntropyCodingUtil.h @@ -30,10 +30,10 @@ extern "C" { #define NUMBER_OF_INTRA_MODES 36 #define NUMBER_OF_INTRA_MODES_MINUS_TWO 34 #define RICE_UPDATE_LENGTH 24 //16 -#define GREATER_THAN1_MAX_NUMBER 8 // maximum number for greater than 1 -#define GREATER_THAN2_MAX_NUMBER 1 // maximum number for greater than 2 +#define GREATER_THAN1_MAX_NUMBER 8 // maximum number for greater than 1 +#define GREATER_THAN2_MAX_NUMBER 1 // maximum number for greater than 2 #define COEF_REMAIN_BIN_REDUCTION 3 -#define CU_DELTA_QP_CMAX 5 +#define CU_DELTA_QP_CMAX 5 #define CU_DELTA_QP_EGK 0 // These are redefined here to avoid conflict with the existing scan indices @@ -261,7 +261,7 @@ EB_ERRORTYPE EstimateMvpIndex( EB_REFLIST refList); EB_ERRORTYPE EstimatePartitionSize( - CodingUnit_t *cuPtr); + CodingUnit_t *cuPtr); EB_ERRORTYPE EstimatePredictionMode( CodingUnit_t *cuPtr); @@ -309,4 +309,4 @@ void EstimateSplitFlag( #ifdef __cplusplus } #endif -#endif //EbEntropyCodingUtil_h \ No newline at end of file +#endif //EbEntropyCodingUtil_h diff --git a/Source/Lib/Codec/EbFullLoop.c b/Source/Lib/Codec/EbFullLoop.c index acd224186..566dcd264 100644 --- a/Source/Lib/Codec/EbFullLoop.c +++ b/Source/Lib/Codec/EbFullLoop.c @@ -12,61 +12,61 @@ #include "EbErrorHandling.h" static const EB_U64 depth0Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { - { - { 1000 }, - { 1000, 4000 }, - { 1000, 4000, 9500 }, - { 1000, 4000, 9500, 3000 }, - { 1000, 4000, 9500, 3000, 3000 }, - { 1000, 4000, 9500, 3000, 3000, 3000 } - }, - - { - { 0 }, - { 0, 1000 }, - { 0, 1000, 7000 }, - { 0, 1000, 7000, 9500 }, - { 0, 1000, 7000, 9500, 9500 }, - { 0, 1000, 7000, 9500, 9500, 9500 } - } + { + { 1000 }, + { 1000, 4000 }, + { 1000, 4000, 9500 }, + { 1000, 4000, 9500, 3000 }, + { 1000, 4000, 9500, 3000, 3000 }, + { 1000, 4000, 9500, 3000, 3000, 3000 } + }, + + { + { 0 }, + { 0, 1000 }, + { 0, 1000, 7000 }, + { 0, 1000, 7000, 9500 }, + { 0, 1000, 7000, 9500, 9500 }, + { 0, 1000, 7000, 9500, 9500, 9500 } + } }; static const EB_U64 depth1Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { - { - { 0 }, - { 0, 2000 }, - { 0, 2000, 5500 }, - { 0, 2000, 5500, 9500 }, - { 0, 2000, 5500, 9500, 9500 }, - { 0, 2000, 5500, 9500, 9500, 9500 } - }, - - { - { 0 }, - { 0, 1500 }, - { 0, 1500, 1500 }, - { 0, 1500, 1500, 1500 }, - { 0, 1500, 1500, 1500, 1500 }, - { 0, 1500, 1500, 1500, 1500, 1500 } - } + { + { 0 }, + { 0, 2000 }, + { 0, 2000, 5500 }, + { 0, 2000, 5500, 9500 }, + { 0, 2000, 5500, 9500, 9500 }, + { 0, 2000, 5500, 9500, 9500, 9500 } + }, + + { + { 0 }, + { 0, 1500 }, + { 0, 1500, 1500 }, + { 0, 1500, 1500, 1500 }, + { 0, 1500, 1500, 1500, 1500 }, + { 0, 1500, 1500, 1500, 1500, 1500 } + } }; static const EB_U64 depth2Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { - { - { 0 }, - { 0, 500 }, - { 0, 500, 2000 }, - { 0, 500, 2000, 2500 }, - { 0, 500, 2000, 2500, 2500 }, - { 0, 500, 2000, 2500, 2500, 2500 } - }, - - { - { 0 }, - { 0, 1500 }, - { 0, 1500, 1000 }, - { 0, 1500, 1000, 4500 }, - { 0, 1500, 1000, 4500, 4500 }, - { 0, 1500, 1000, 4500, 4500, 4500 } - } + { + { 0 }, + { 0, 500 }, + { 0, 500, 2000 }, + { 0, 500, 2000, 2500 }, + { 0, 500, 2000, 2500, 2500 }, + { 0, 500, 2000, 2500, 2500, 2500 } + }, + + { + { 0 }, + { 0, 1500 }, + { 0, 1500, 1000 }, + { 0, 1500, 1000, 4500 }, + { 0, 1500, 1000, 4500, 4500 }, + { 0, 1500, 1000, 4500, 4500, 4500 } + } }; /********************************************************************* @@ -75,510 +75,510 @@ static const EB_U64 depth2Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { * Unified Quant +iQuant *********************************************************************/ void ProductUnifiedQuantizeInvQuantizeMd( - PictureControlSet_t *pictureControlSetPtr, - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 areaSize, - EB_U32 *yCountNonZeroCoeffs, - EB_PF_MODE pfMode, - EB_U8 enableContouringQCUpdateFlag, - EB_U32 componentType, + PictureControlSet_t *pictureControlSetPtr, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 areaSize, + EB_U32 *yCountNonZeroCoeffs, + EB_PF_MODE pfMode, + EB_U8 enableContouringQCUpdateFlag, + EB_U32 componentType, EB_RDOQ_PMCORE_TYPE rdoqPmCoreMethod, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost) { EB_PICTURE sliceType = pictureControlSetPtr->sliceType; EB_U32 temporalLayerIndex = pictureControlSetPtr->temporalLayerIndex; - //for the Quant - const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 - const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) - const EB_U32 qFunc = QFunc[qpRem]; // 15 bits - - const EB_U32 transformShiftNum = 7 - Log2f(areaSize); - const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; - const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); - - //for the iQuant - const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT - const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; - const EB_S32 iq_offset = 1 << (shiftNum - 1); - - - if (pfMode == PF_N2) { - areaSize = areaSize >> 1; - } else if (pfMode == PF_N4) { - areaSize = areaSize >> 2; - } - - if (rdoqPmCoreMethod){ - DecoupledQuantizeInvQuantizeLoops( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - cabacEncodeCtxPtr, - lambda, - type, - intraLumaMode, - intraChromaMode, - componentType, - pictureControlSetPtr->temporalLayerIndex, - pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, + //for the Quant + const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 + const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) + const EB_U32 qFunc = QFunc[qpRem]; // 15 bits + + const EB_U32 transformShiftNum = 7 - Log2f(areaSize); + const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; + const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); + + //for the iQuant + const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT + const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; + const EB_S32 iq_offset = 1 << (shiftNum - 1); + + + if (pfMode == PF_N2) { + areaSize = areaSize >> 1; + } else if (pfMode == PF_N4) { + areaSize = areaSize >> 2; + } + + if (rdoqPmCoreMethod){ + DecoupledQuantizeInvQuantizeLoops( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + cabacEncodeCtxPtr, + lambda, + type, + intraLumaMode, + intraChromaMode, + componentType, + pictureControlSetPtr->temporalLayerIndex, + pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, (EB_U8) 0, (EB_U16)qp, (EB_U32)EB_8BIT, - CabacCost, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), + CabacCost, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), rdoqPmCoreMethod); - } - else{ - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs)); - - UpdateQiQCoef( - quantCoeff, - reconCoeff, - coeffStride, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), - componentType, - sliceType, - temporalLayerIndex, - 0, - enableContouringQCUpdateFlag); - } + } + else{ + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs)); + + UpdateQiQCoef( + quantCoeff, + reconCoeff, + coeffStride, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), + componentType, + sliceType, + temporalLayerIndex, + 0, + enableContouringQCUpdateFlag); + } } /**************************************** ************ Full loop **************** ****************************************/ void ProductFullLoop( - EbPictureBufferDesc_t *inputPicturePtr, - EB_U32 inputOriginIndex, - ModeDecisionCandidateBuffer_t *candidateBuffer, - ModeDecisionContext_t *contextPtr, - const CodedUnitStats_t *cuStatsPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 qp, - EB_U32 *yCountNonZeroCoeffs, - EB_U64 *yCoeffBits, - EB_U64 *yFullDistortion) + EbPictureBufferDesc_t *inputPicturePtr, + EB_U32 inputOriginIndex, + ModeDecisionCandidateBuffer_t *candidateBuffer, + ModeDecisionContext_t *contextPtr, + const CodedUnitStats_t *cuStatsPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 qp, + EB_U32 *yCountNonZeroCoeffs, + EB_U64 *yCoeffBits, + EB_U64 *yFullDistortion) { - EB_U32 tuOriginIndex; - - EB_U32 currentTuIndex,tuIt; - EB_U64 yTuCoeffBits; - EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; - candidateBuffer->yDc[0] = 0; - candidateBuffer->yDc[1] = 0; - candidateBuffer->yDc[2] = 0; - candidateBuffer->yDc[3] = 0; - candidateBuffer->yCountNonZeroCoeffs[0] = 0; - candidateBuffer->yCountNonZeroCoeffs[1] = 0; - candidateBuffer->yCountNonZeroCoeffs[2] = 0; - candidateBuffer->yCountNonZeroCoeffs[3] = 0; - - if (cuStatsPtr->size == MAX_LCU_SIZE){ - - for (tuIt = 0; tuIt < 4; tuIt++) - { - - tuOriginIndex = ((tuIt & 1) << 5) + ((tuIt>1) << 11); - currentTuIndex = tuIt + 1; - yTuCoeffBits = 0; - EstimateTransform( - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - 32, - contextPtr->transformInnerArrayPtr, - 0, - EB_FALSE, - contextPtr->pfMdMode); - - - ProductUnifiedQuantizeInvQuantizeMd( - pictureControlSetPtr, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - qp, - 32, - &(yCountNonZeroCoeffs[currentTuIndex]), - contextPtr->pfMdMode, - 0, - COMPONENT_LUMA, + EB_U32 tuOriginIndex; + + EB_U32 currentTuIndex,tuIt; + EB_U64 yTuCoeffBits; + EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; + candidateBuffer->yDc[0] = 0; + candidateBuffer->yDc[1] = 0; + candidateBuffer->yDc[2] = 0; + candidateBuffer->yDc[3] = 0; + candidateBuffer->yCountNonZeroCoeffs[0] = 0; + candidateBuffer->yCountNonZeroCoeffs[1] = 0; + candidateBuffer->yCountNonZeroCoeffs[2] = 0; + candidateBuffer->yCountNonZeroCoeffs[3] = 0; + + if (cuStatsPtr->size == MAX_LCU_SIZE){ + + for (tuIt = 0; tuIt < 4; tuIt++) + { + + tuOriginIndex = ((tuIt & 1) << 5) + ((tuIt>1) << 11); + currentTuIndex = tuIt + 1; + yTuCoeffBits = 0; + EstimateTransform( + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + 32, + contextPtr->transformInnerArrayPtr, + 0, + EB_FALSE, + contextPtr->pfMdMode); + + + ProductUnifiedQuantizeInvQuantizeMd( + pictureControlSetPtr, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + qp, + 32, + &(yCountNonZeroCoeffs[currentTuIndex]), + contextPtr->pfMdMode, + 0, + COMPONENT_LUMA, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); - - PictureFullDistortionLuma( - contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr, - tuOriginIndex, - candidateBuffer->reconCoeffPtr, - tuOriginIndex, - (32 >> contextPtr->pfMdMode), - tuFullDistortion[0], - yCountNonZeroCoeffs[currentTuIndex], - candidateBuffer->candidatePtr->type); - - - tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + 8) >> 4; - tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + 8) >> 4; - - TuEstimateCoeffBitsLuma( - tuOriginIndex, - contextPtr->coeffEstEntropyCoderPtr, - candidateBuffer->residualQuantCoeffPtr, - yCountNonZeroCoeffs[currentTuIndex], - &yTuCoeffBits, - 32, - candidateBuffer->candidatePtr->type, - candidateBuffer->candidatePtr->intraLumaMode, - contextPtr->pfMdMode, - contextPtr->coeffCabacUpdate, - &(candidateBuffer->candBuffCoeffCtxModel), - contextPtr->CabacCost); - - TuCalcCostLuma( - MAX_LCU_SIZE, - candidateBuffer->candidatePtr, - currentTuIndex, - 32, - yCountNonZeroCoeffs[currentTuIndex], - tuFullDistortion[0], - &yTuCoeffBits, - contextPtr->qp, - contextPtr->fullLambda, - contextPtr->fullChromaLambda); - - (*yCoeffBits) += yTuCoeffBits; - yFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[0][DIST_CALC_RESIDUAL]; - yFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[0][DIST_CALC_PREDICTION]; - candidateBuffer->yDc[tuIt] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); - candidateBuffer->yCountNonZeroCoeffs[tuIt] = (EB_U16)yCountNonZeroCoeffs[currentTuIndex]; - - } - - }else{ - - tuOriginIndex = cuStatsPtr->originX + (cuStatsPtr->originY<<6); - yTuCoeffBits = 0; - EstimateTransform( - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - cuStatsPtr->size, - contextPtr->transformInnerArrayPtr, - 0, - EB_FALSE, - contextPtr->pfMdMode); - - ProductUnifiedQuantizeInvQuantizeMd( - pictureControlSetPtr, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - qp, - cuStatsPtr->size, - &(yCountNonZeroCoeffs[0]), - contextPtr->pfMdMode, - 0, - COMPONENT_LUMA, + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); + + PictureFullDistortionLuma( + contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr, + tuOriginIndex, + candidateBuffer->reconCoeffPtr, + tuOriginIndex, + (32 >> contextPtr->pfMdMode), + tuFullDistortion[0], + yCountNonZeroCoeffs[currentTuIndex], + candidateBuffer->candidatePtr->type); + + + tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + 8) >> 4; + tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + 8) >> 4; + + TuEstimateCoeffBitsLuma( + tuOriginIndex, + contextPtr->coeffEstEntropyCoderPtr, + candidateBuffer->residualQuantCoeffPtr, + yCountNonZeroCoeffs[currentTuIndex], + &yTuCoeffBits, + 32, + candidateBuffer->candidatePtr->type, + candidateBuffer->candidatePtr->intraLumaMode, + contextPtr->pfMdMode, + contextPtr->coeffCabacUpdate, + &(candidateBuffer->candBuffCoeffCtxModel), + contextPtr->CabacCost); + + TuCalcCostLuma( + MAX_LCU_SIZE, + candidateBuffer->candidatePtr, + currentTuIndex, + 32, + yCountNonZeroCoeffs[currentTuIndex], + tuFullDistortion[0], + &yTuCoeffBits, + contextPtr->qp, + contextPtr->fullLambda, + contextPtr->fullChromaLambda); + + (*yCoeffBits) += yTuCoeffBits; + yFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[0][DIST_CALC_RESIDUAL]; + yFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[0][DIST_CALC_PREDICTION]; + candidateBuffer->yDc[tuIt] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); + candidateBuffer->yCountNonZeroCoeffs[tuIt] = (EB_U16)yCountNonZeroCoeffs[currentTuIndex]; + + } + + }else{ + + tuOriginIndex = cuStatsPtr->originX + (cuStatsPtr->originY<<6); + yTuCoeffBits = 0; + EstimateTransform( + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + cuStatsPtr->size, + contextPtr->transformInnerArrayPtr, + 0, + EB_FALSE, + contextPtr->pfMdMode); + + ProductUnifiedQuantizeInvQuantizeMd( + pictureControlSetPtr, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + qp, + cuStatsPtr->size, + &(yCountNonZeroCoeffs[0]), + contextPtr->pfMdMode, + 0, + COMPONENT_LUMA, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); - - if (contextPtr->spatialSseFullLoop == EB_TRUE) { - - if (yCountNonZeroCoeffs[0]) { - //since we are missing PF-N2 version for 16x16 and 8x8 iT, do zero out. - if (cuStatsPtr->size < 32 && contextPtr->pfMdMode == PF_N2) { - PfZeroOutUselessQuadrants( - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - candidateBuffer->reconCoeffPtr->strideY, - (cuStatsPtr->size >> 1)); - } - - EstimateInvTransform( - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - candidateBuffer->reconCoeffPtr->strideY, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), - contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, - cuStatsPtr->size, - contextPtr->transformInnerArrayPtr, - BIT_INCREMENT_8BIT, - EB_FALSE, - cuStatsPtr->size < 32 ? PF_OFF : contextPtr->pfMdMode); + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); + + if (contextPtr->spatialSseFullLoop == EB_TRUE) { + + if (yCountNonZeroCoeffs[0]) { + //since we are missing PF-N2 version for 16x16 and 8x8 iT, do zero out. + if (cuStatsPtr->size < 32 && contextPtr->pfMdMode == PF_N2) { + PfZeroOutUselessQuadrants( + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + candidateBuffer->reconCoeffPtr->strideY, + (cuStatsPtr->size >> 1)); + } + + EstimateInvTransform( + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + candidateBuffer->reconCoeffPtr->strideY, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), + contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, + cuStatsPtr->size, + contextPtr->transformInnerArrayPtr, + BIT_INCREMENT_8BIT, + EB_FALSE, + cuStatsPtr->size < 32 ? PF_OFF : contextPtr->pfMdMode); if ((cuStatsPtr->size >> 3) < 9) - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][cuStatsPtr->size >> 3]( - &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), - 64, - &(((EB_S16*)(contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY))[tuOriginIndex]), - contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, - &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), - candidateBuffer->reconPtr->strideY, - cuStatsPtr->size, - cuStatsPtr->size); - - } - else { - - PictureCopy8Bit( - candidateBuffer->predictionPtr, - tuOriginIndex, - 0, - candidateBuffer->reconPtr, - tuOriginIndex, - 0, - cuStatsPtr->size, - cuStatsPtr->size, - 0, - 0, - PICTURE_BUFFER_DESC_Y_FLAG); - } - - tuFullDistortion[0][DIST_CALC_RESIDUAL] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( - &(inputPicturePtr->bufferY[inputOriginIndex]), - inputPicturePtr->strideY, - &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), - candidateBuffer->reconPtr->strideY, - cuStatsPtr->size, - cuStatsPtr->size); - - tuFullDistortion[0][DIST_CALC_PREDICTION] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( - &(inputPicturePtr->bufferY[inputOriginIndex]), - inputPicturePtr->strideY, - &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), - candidateBuffer->predictionPtr->strideY, - cuStatsPtr->size, - cuStatsPtr->size); - } - else { - - PictureFullDistortionLuma( - contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr, - tuOriginIndex, - candidateBuffer->reconCoeffPtr, - tuOriginIndex, - (contextPtr->cuStats->size >> contextPtr->pfMdMode), - tuFullDistortion[0], - yCountNonZeroCoeffs[0], - candidateBuffer->candidatePtr->type); - - const EB_U32 lumaShift = 2 * (7 - Log2f(cuStatsPtr->size)); - tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; - tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; - } - - TuEstimateCoeffBitsLuma( - tuOriginIndex, - contextPtr->coeffEstEntropyCoderPtr, - candidateBuffer->residualQuantCoeffPtr, - yCountNonZeroCoeffs[0], - &yTuCoeffBits, - contextPtr->cuStats->size, - candidateBuffer->candidatePtr->type, - candidateBuffer->candidatePtr->intraLumaMode, - contextPtr->pfMdMode, - contextPtr->coeffCabacUpdate, - &(candidateBuffer->candBuffCoeffCtxModel), - contextPtr->CabacCost); - - TuCalcCostLuma( - cuStatsPtr->size, - candidateBuffer->candidatePtr, - 0, - cuStatsPtr->size, - yCountNonZeroCoeffs[0], - tuFullDistortion[0], - &yTuCoeffBits, - contextPtr->qp, - contextPtr->fullLambda, - contextPtr->fullChromaLambda); - - (*yCoeffBits) += yTuCoeffBits; - yFullDistortion[DIST_CALC_RESIDUAL] = tuFullDistortion[0][DIST_CALC_RESIDUAL]; - yFullDistortion[DIST_CALC_PREDICTION] = tuFullDistortion[0][DIST_CALC_PREDICTION]; - candidateBuffer->yDc[0] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); - candidateBuffer->yCountNonZeroCoeffs[0] = (EB_U16)yCountNonZeroCoeffs[0]; - } + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][cuStatsPtr->size >> 3]( + &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), + 64, + &(((EB_S16*)(contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY))[tuOriginIndex]), + contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, + &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), + candidateBuffer->reconPtr->strideY, + cuStatsPtr->size, + cuStatsPtr->size); + + } + else { + + PictureCopy8Bit( + candidateBuffer->predictionPtr, + tuOriginIndex, + 0, + candidateBuffer->reconPtr, + tuOriginIndex, + 0, + cuStatsPtr->size, + cuStatsPtr->size, + 0, + 0, + PICTURE_BUFFER_DESC_Y_FLAG); + } + + tuFullDistortion[0][DIST_CALC_RESIDUAL] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( + &(inputPicturePtr->bufferY[inputOriginIndex]), + inputPicturePtr->strideY, + &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), + candidateBuffer->reconPtr->strideY, + cuStatsPtr->size, + cuStatsPtr->size); + + tuFullDistortion[0][DIST_CALC_PREDICTION] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( + &(inputPicturePtr->bufferY[inputOriginIndex]), + inputPicturePtr->strideY, + &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), + candidateBuffer->predictionPtr->strideY, + cuStatsPtr->size, + cuStatsPtr->size); + } + else { + + PictureFullDistortionLuma( + contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr, + tuOriginIndex, + candidateBuffer->reconCoeffPtr, + tuOriginIndex, + (contextPtr->cuStats->size >> contextPtr->pfMdMode), + tuFullDistortion[0], + yCountNonZeroCoeffs[0], + candidateBuffer->candidatePtr->type); + + const EB_U32 lumaShift = 2 * (7 - Log2f(cuStatsPtr->size)); + tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; + tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; + } + + TuEstimateCoeffBitsLuma( + tuOriginIndex, + contextPtr->coeffEstEntropyCoderPtr, + candidateBuffer->residualQuantCoeffPtr, + yCountNonZeroCoeffs[0], + &yTuCoeffBits, + contextPtr->cuStats->size, + candidateBuffer->candidatePtr->type, + candidateBuffer->candidatePtr->intraLumaMode, + contextPtr->pfMdMode, + contextPtr->coeffCabacUpdate, + &(candidateBuffer->candBuffCoeffCtxModel), + contextPtr->CabacCost); + + TuCalcCostLuma( + cuStatsPtr->size, + candidateBuffer->candidatePtr, + 0, + cuStatsPtr->size, + yCountNonZeroCoeffs[0], + tuFullDistortion[0], + &yTuCoeffBits, + contextPtr->qp, + contextPtr->fullLambda, + contextPtr->fullChromaLambda); + + (*yCoeffBits) += yTuCoeffBits; + yFullDistortion[DIST_CALC_RESIDUAL] = tuFullDistortion[0][DIST_CALC_RESIDUAL]; + yFullDistortion[DIST_CALC_PREDICTION] = tuFullDistortion[0][DIST_CALC_PREDICTION]; + candidateBuffer->yDc[0] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); + candidateBuffer->yCountNonZeroCoeffs[0] = (EB_U16)yCountNonZeroCoeffs[0]; + } } void UnifiedQuantizeInvQuantize_R( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 bitDepth, - EB_U32 areaSize, - EB_PICTURE sliceType, - EB_U32 *yCountNonZeroCoeffs, - EB_S8 mdNonZeroCoeff, - EB_PF_MODE pfMode, - EB_U32 tuOriginX, - EB_U32 tuOriginY, - EB_U32 lcuOriginY, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag, - EB_MODETYPE type, - EB_U32 componentType, - EB_U32 temporalLayerIndex, - EB_BOOL encDecFlag, - EB_U32 dZoffset, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 bitDepth, + EB_U32 areaSize, + EB_PICTURE sliceType, + EB_U32 *yCountNonZeroCoeffs, + EB_S8 mdNonZeroCoeff, + EB_PF_MODE pfMode, + EB_U32 tuOriginX, + EB_U32 tuOriginY, + EB_U32 lcuOriginY, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag, + EB_MODETYPE type, + EB_U32 componentType, + EB_U32 temporalLayerIndex, + EB_BOOL encDecFlag, + EB_U32 dZoffset, EB_RDOQ_PMCORE_TYPE rdoqPmCoreMethod, CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost) + EB_U64 lambda, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost) { - //for the Quant - const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 - const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) - const EB_U32 qFunc = QFunc[qpRem]; // 15 bits - - const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit - - const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); - const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; - const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); - - //for the iQuant - const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT - const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; - const EB_S32 iq_offset = 1 << (shiftNum - 1); - EB_U32 adptive_qp_offset; - - adptive_qp_offset = q_offset; - - (void)(encDecFlag); - (void)(mdNonZeroCoeff); - adptive_qp_offset = dZoffset ? (dZoffset * (1 << shiftedQBits) / 20) : adptive_qp_offset; - - if (pfMode == PF_N2) { - areaSize = areaSize >> 1; - } else if (pfMode == PF_N4) { - areaSize = areaSize >> 2; - } - - if (rdoqPmCoreMethod){ - - DecoupledQuantizeInvQuantizeLoops( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - cabacEncodeCtxPtr, - lambda, - type, - intraLumaMode, - intraChromaMode, - componentType, + //for the Quant + const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 + const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) + const EB_U32 qFunc = QFunc[qpRem]; // 15 bits + + const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit + + const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); + const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; + const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); + + //for the iQuant + const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT + const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; + const EB_S32 iq_offset = 1 << (shiftNum - 1); + EB_U32 adptive_qp_offset; + + adptive_qp_offset = q_offset; + + (void)(encDecFlag); + (void)(mdNonZeroCoeff); + adptive_qp_offset = dZoffset ? (dZoffset * (1 << shiftedQBits) / 20) : adptive_qp_offset; + + if (pfMode == PF_N2) { + areaSize = areaSize >> 1; + } else if (pfMode == PF_N4) { + areaSize = areaSize >> 2; + } + + if (rdoqPmCoreMethod){ + + DecoupledQuantizeInvQuantizeLoops( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + cabacEncodeCtxPtr, + lambda, + type, + intraLumaMode, + intraChromaMode, + componentType, (EB_U8)temporalLayerIndex, - temporalLayerIndex < 3 ? EB_TRUE : EB_FALSE, + temporalLayerIndex < 3 ? EB_TRUE : EB_FALSE, (EB_U8)0, (EB_U16)qp, bitDepth, - CabacCost, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), + CabacCost, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), rdoqPmCoreMethod); - }else{ - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - qFunc, - adptive_qp_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs)); - - UpdateQiQCoef_R( - quantCoeff, - reconCoeff, - coeffStride, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), - componentType, - sliceType, - temporalLayerIndex, - enableCbflag, - enableContouringQCUpdateFlag); - } - - (void)tuOriginX; - (void)tuOriginY; - (void)lcuOriginY; + }else{ + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + qFunc, + adptive_qp_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs)); + + UpdateQiQCoef_R( + quantCoeff, + reconCoeff, + coeffStride, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), + componentType, + sliceType, + temporalLayerIndex, + enableCbflag, + enableContouringQCUpdateFlag); + } + + (void)tuOriginX; + (void)tuOriginY; + (void)lcuOriginY; (void)type; } /**************************************** ************ Full loop **************** ****************************************/ void FullLoop_R ( - LargestCodingUnit_t *lcuPtr, + LargestCodingUnit_t *lcuPtr, ModeDecisionCandidateBuffer_t *candidateBuffer, ModeDecisionContext_t *contextPtr, const CodedUnitStats_t *cuStatsPtr, @@ -587,27 +587,27 @@ void FullLoop_R ( EB_U32 componentMask, EB_U32 cbQp, EB_U32 crQp, - EB_U32 *cbCountNonZeroCoeffs, - EB_U32 *crCountNonZeroCoeffs) + EB_U32 *cbCountNonZeroCoeffs, + EB_U32 *crCountNonZeroCoeffs) { - (void)lcuPtr; + (void)lcuPtr; EB_S16 *chromaResidualPtr; EB_U32 tuIndex; EB_U32 tuOriginIndex; EB_U32 tuCbOriginIndex; - EB_U32 tuCrOriginIndex; - EB_U32 tuCount; + EB_U32 tuCrOriginIndex; + EB_U32 tuCount; const TransformUnitStats_t *tuStatPtr; EB_U32 tuItr; EB_U32 tuSize; EB_U32 chromatTuSize; EB_U32 tuOriginX; EB_U32 tuOriginY; - + EbPictureBufferDesc_t * tuTransCoeffTmpPtr; EbPictureBufferDesc_t * tuQuantCoeffTmpPtr; - + if (cuStatsPtr->size == MAX_LCU_SIZE) { tuCount = 4; tuIndex = 1; @@ -653,7 +653,7 @@ void FullLoop_R ( //&(((EB_S16*) candidateBuffer->intraChromaResidualPtr->bufferCb)[tuChromaOriginIndex]): &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferCb)[tuCbOriginIndex]); - // Cb Transform + // Cb Transform EstimateTransform( chromaResidualPtr, candidateBuffer->residualQuantCoeffPtr->strideCb, @@ -665,34 +665,34 @@ void FullLoop_R ( EB_FALSE, correctedPFMode); - UnifiedQuantizeInvQuantize_R( - &(((EB_S16*)tuTransCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), - tuTransCoeffTmpPtr->strideCb, - &(((EB_S16*)tuQuantCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferCb)[tuCbOriginIndex]), - cbQp, - inputPicturePtr->bitDepth, - chromatTuSize, - pictureControlSetPtr->sliceType, - &(cbCountNonZeroCoeffs[tuIndex]), - -1, - correctedPFMode, - 0, - 0, - 0, - 0, - 0, - candidateBuffer->candidatePtr->type, - COMPONENT_CHROMA, - pictureControlSetPtr->temporalLayerIndex, - EB_FALSE, - 0, + UnifiedQuantizeInvQuantize_R( + &(((EB_S16*)tuTransCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), + tuTransCoeffTmpPtr->strideCb, + &(((EB_S16*)tuQuantCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferCb)[tuCbOriginIndex]), + cbQp, + inputPicturePtr->bitDepth, + chromatTuSize, + pictureControlSetPtr->sliceType, + &(cbCountNonZeroCoeffs[tuIndex]), + -1, + correctedPFMode, + 0, + 0, + 0, + 0, + 0, + candidateBuffer->candidatePtr->type, + COMPONENT_CHROMA, + pictureControlSetPtr->temporalLayerIndex, + EB_FALSE, + 0, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); if (contextPtr->spatialSseFullLoop == EB_TRUE) { if (cbCountNonZeroCoeffs[tuIndex]) { @@ -754,12 +754,12 @@ void FullLoop_R ( if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - // Configure the Chroma Residual Ptr + // Configure the Chroma Residual Ptr chromaResidualPtr = //(candidateBuffer->candidatePtr->type == INTRA_MODE )? //&(((EB_S16*) candidateBuffer->intraChromaResidualPtr->bufferCr)[tuChromaOriginIndex]): &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferCr)[tuCrOriginIndex]); - // Cr Transform + // Cr Transform EstimateTransform( chromaResidualPtr, candidateBuffer->residualQuantCoeffPtr->strideCr, @@ -794,11 +794,11 @@ void FullLoop_R ( EB_FALSE, 0, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); if (contextPtr->spatialSseFullLoop == EB_TRUE) { if (crCountNonZeroCoeffs[tuIndex]) { @@ -857,9 +857,9 @@ void FullLoop_R ( } } - + ++tuItr; - tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; } while (tuItr < tuCount); @@ -871,36 +871,36 @@ void FullLoop_R ( void CuFullDistortionFastTuMode_R ( EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputCbOriginIndex, - LargestCodingUnit_t *lcuPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, - ModeDecisionContext_t *contextPtr , - ModeDecisionCandidate_t *candidatePtr, - const CodedUnitStats_t *cuStatsPtr, - EB_U64 cbFullDistortion[DIST_CALC_TOTAL] , - EB_U64 crFullDistortion[DIST_CALC_TOTAL] , - EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU], - EB_U32 componentMask, + LargestCodingUnit_t *lcuPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, + ModeDecisionContext_t *contextPtr , + ModeDecisionCandidate_t *candidatePtr, + const CodedUnitStats_t *cuStatsPtr, + EB_U64 cbFullDistortion[DIST_CALC_TOTAL] , + EB_U64 crFullDistortion[DIST_CALC_TOTAL] , + EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU], + EB_U32 componentMask, EB_U64 *cbCoeffBits, EB_U64 *crCoeffBits) { - (void)lcuPtr; + (void)lcuPtr; EB_U64 yTuCoeffBits; EB_U64 cbTuCoeffBits; EB_U64 crTuCoeffBits; - EB_U32 tuOriginIndex; - EB_U32 tuOriginX; - EB_U32 tuOriginY; - EB_U32 currentTuIndex; - EB_U32 chromaShift; + EB_U32 tuOriginIndex; + EB_U32 tuOriginX; + EB_U32 tuOriginY; + EB_U32 currentTuIndex; + EB_U32 chromaShift; EB_U32 tuChromaOriginIndex; - EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; - EbPictureBufferDesc_t *transformBuffer; - EB_U32 tuTotalCount; - EB_U32 tuSize; - EB_U32 chromaTuSize; - const TransformUnitStats_t *tuStatPtr; - EB_U32 tuItr = 0; + EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; + EbPictureBufferDesc_t *transformBuffer; + EB_U32 tuTotalCount; + EB_U32 tuSize; + EB_U32 chromaTuSize; + const TransformUnitStats_t *tuStatPtr; + EB_U32 tuItr = 0; if (cuStatsPtr->size == MAX_LCU_SIZE){ currentTuIndex = 1; @@ -914,24 +914,24 @@ void CuFullDistortionFastTuMode_R ( tuTotalCount = 1; } - do { + do { tuStatPtr = GetTransformUnitStats(currentTuIndex); tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatPtr->offsetX); tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatPtr->offsetY); tuSize = cuStatsPtr->size >> tuStatPtr->depth; chromaTuSize = tuSize == 4 ? tuSize : (tuSize >> 1); - tuOriginIndex = tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideY ; + tuOriginIndex = tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideY ; tuChromaOriginIndex = tuSize == 4 ? - tuOriginIndex : + tuOriginIndex : ((tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideCb) >> 1); // Reset the Bit Costs yTuCoeffBits = 0; - cbTuCoeffBits = 0; + cbTuCoeffBits = 0; crTuCoeffBits = 0; - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK){ + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK){ EB_U32 countNonZeroCoeffsAll[3]; countNonZeroCoeffsAll[0] = countNonZeroCoeffs[0][currentTuIndex]; @@ -939,7 +939,7 @@ void CuFullDistortionFastTuMode_R ( countNonZeroCoeffsAll[2] = countNonZeroCoeffs[2][currentTuIndex]; EB_PF_MODE correctedPFMode = contextPtr->pfMdMode; - + if(chromaTuSize == 4) correctedPFMode = PF_OFF; else if(chromaTuSize == 8 && contextPtr->pfMdMode == PF_N4) @@ -984,7 +984,7 @@ void CuFullDistortionFastTuMode_R ( else { // *Full Distortion (SSE) // *Note - there are known issues with how this distortion metric is currently - // calculated. The amount of scaling between the two arrays is not + // calculated. The amount of scaling between the two arrays is not // equivalent. PictureFullDistortion_R( transformBuffer, @@ -993,7 +993,7 @@ void CuFullDistortionFastTuMode_R ( candidateBuffer->reconCoeffPtr, (tuSize >> contextPtr->pfMdMode), (chromaTuSize >> correctedPFMode), - PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, + PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, tuFullDistortion[0], tuFullDistortion[1], tuFullDistortion[2], @@ -1006,7 +1006,7 @@ void CuFullDistortionFastTuMode_R ( tuFullDistortion[1][DIST_CALC_PREDICTION] = (tuFullDistortion[1][DIST_CALC_PREDICTION] + (EB_U64)(1 << (chromaShift - 1))) >> chromaShift; tuFullDistortion[2][DIST_CALC_RESIDUAL] = (tuFullDistortion[2][DIST_CALC_RESIDUAL] + (EB_U64)(1 << (chromaShift - 1))) >> chromaShift; tuFullDistortion[2][DIST_CALC_PREDICTION] = (tuFullDistortion[2][DIST_CALC_PREDICTION] + (EB_U64)(1 << (chromaShift - 1))) >> chromaShift; - + } TuEstimateCoeffBits_R( @@ -1031,362 +1031,362 @@ void CuFullDistortionFastTuMode_R ( &(candidateBuffer->candBuffCoeffCtxModel), contextPtr->CabacCost); - TuCalcCost( + TuCalcCost( contextPtr->cuSize, candidatePtr, currentTuIndex, tuSize, chromaTuSize, countNonZeroCoeffs[0][currentTuIndex], - countNonZeroCoeffs[1][currentTuIndex], - countNonZeroCoeffs[2][currentTuIndex], + countNonZeroCoeffs[1][currentTuIndex], + countNonZeroCoeffs[2][currentTuIndex], tuFullDistortion[0], tuFullDistortion[1], tuFullDistortion[2], - PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, + PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, &yTuCoeffBits, &cbTuCoeffBits, &crTuCoeffBits, contextPtr->qp, contextPtr->fullLambda, - contextPtr->fullChromaLambda); + contextPtr->fullChromaLambda); - *cbCoeffBits += cbTuCoeffBits; + *cbCoeffBits += cbTuCoeffBits; *crCoeffBits += crTuCoeffBits; cbFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[1][DIST_CALC_RESIDUAL]; crFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[2][DIST_CALC_RESIDUAL]; cbFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[1][DIST_CALC_PREDICTION]; crFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[2][DIST_CALC_PREDICTION]; - } + } ++tuItr; - currentTuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + currentTuIndex = tuIndexList[tuStatPtr->depth][tuItr]; - } while (tuItr < tuTotalCount); + } while (tuItr < tuTotalCount); } EB_U32 ExitInterDepthDecision( - ModeDecisionContext_t *contextPtr, - EB_U32 leafIndex, - LargestCodingUnit_t *tbPtr, - EB_U32 lcuAddr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_U64 fullLambda, - MdRateEstimationContext_t *mdRateEstimationPtr, - PictureControlSet_t *pictureControlSetPtr) + ModeDecisionContext_t *contextPtr, + EB_U32 leafIndex, + LargestCodingUnit_t *tbPtr, + EB_U32 lcuAddr, + EB_U32 tbOriginX, + EB_U32 tbOriginY, + EB_U64 fullLambda, + MdRateEstimationContext_t *mdRateEstimationPtr, + PictureControlSet_t *pictureControlSetPtr) { - EB_U32 lastCuIndex; - EB_U32 leftCuIndex; - EB_U32 topCuIndex; - EB_U32 topLeftCuIndex; - EB_U32 depthZeroCandidateCuIndex; - EB_U32 depthOneCandidateCuIndex = leafIndex; - EB_U32 depthTwoCandidateCuIndex = leafIndex; - EB_U64 depthNRate = 0; - EB_U64 depthNPlusOneRate = 0; - EB_U64 depthNCost = 0; - EB_U64 depthNPlusOneCost = 0; - EB_U32 cuOriginX; - EB_U32 cuOriginY; - EB_U32 tbMaxDepth = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - const CodedUnitStats_t *curCuStatsPtr; - const CodedUnitStats_t *depthTwoCuStatsPtr; - const CodedUnitStats_t *depthOneCuStatsPtr; - const CodedUnitStats_t *depthZeroCuStatsPtr; - - (void)lcuAddr; - lastCuIndex = leafIndex; - curCuStatsPtr = GetCodedUnitStats(leafIndex); - cuOriginX = tbOriginX + curCuStatsPtr->originX; - cuOriginY = tbOriginY + curCuStatsPtr->originY; - - - - //Parent is winner, update its cost, and trigger and inter-depth check-point. - EB_U64 SplitRate = 0; - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[leafIndex], - 0, - &SplitRate, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - sequenceControlSetPtr->maxLcuDepth); - - contextPtr->mdLocalCuUnit[leafIndex].cost += SplitRate; - - if (curCuStatsPtr->depth == 0) { - contextPtr->groupOf16x16BlocksCount = 0; - } - else if (curCuStatsPtr->depth == 1) { - contextPtr->groupOf16x16BlocksCount++; - contextPtr->groupOf8x8BlocksCount = 0; - } - else if (curCuStatsPtr->depth == 2) { - contextPtr->groupOf8x8BlocksCount++; - } - - - /*** Stage 0: Inter depth decision: depth 2 vs depth 3 ***/ - - // Walks to the last coded 8x8 block for merging - if ((GROUP_OF_4_8x8_BLOCKS(cuOriginX, cuOriginY))) { - - depthTwoCandidateCuIndex = leafIndex - DEPTH_THREE_STEP - DEPTH_THREE_STEP - DEPTH_THREE_STEP - 1; - - contextPtr->groupOf8x8BlocksCount++; - - // From the last coded cu index, get the indices of the left, top, and top left cus - leftCuIndex = leafIndex - DEPTH_THREE_STEP; - topCuIndex = leftCuIndex - DEPTH_THREE_STEP; - topLeftCuIndex = topCuIndex - DEPTH_THREE_STEP; - - // From the top left index, get the index of the candidate pu for merging - depthTwoCandidateCuIndex = topLeftCuIndex - 1; - - // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation - // This needs to be done in the case that the N block was initially not calculated. - - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; - - // Compute depth N cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 0, - &depthNRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; - - depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[leafIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - - - // Inter depth comparison: depth 2 vs depth 3 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthTwoCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; - } - - - } - - // Stage 1: Inter depth decision: depth 1 vs depth 2 - - // Walks to the last coded 16x16 block for merging - depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); - cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; - cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; - - if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && - (contextPtr->groupOf8x8BlocksCount == 4)){ - - - depthOneCandidateCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP - DEPTH_TWO_STEP - DEPTH_TWO_STEP - 1; - - contextPtr->groupOf8x8BlocksCount = 0; - contextPtr->groupOf16x16BlocksCount++; - - // From the last coded pu index, get the indices of the left, top, and top left pus - leftCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP; - topCuIndex = leftCuIndex - DEPTH_TWO_STEP; - topLeftCuIndex = topCuIndex - DEPTH_TWO_STEP; - - // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation - // This needs to be done in the case that the N block was initially not calculated. - - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; - - // From the top left index, get the index of the candidate pu for merging - depthOneCandidateCuIndex = topLeftCuIndex - 1; - - depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); - if (depthOneCuStatsPtr->depth == 1) { - - // Compute depth N cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 0, - &depthNRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - - - // Inter depth comparison: depth 1 vs depth 2 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthOneCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; - } - - - } - } - - // Stage 2: Inter depth decision: depth 0 vs depth 1 - - // Walks to the last coded 32x32 block for merging - // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates - depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); - cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; - cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; - if ((pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) - && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && - (contextPtr->groupOf16x16BlocksCount == 4)) { - - depthZeroCandidateCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP - DEPTH_ONE_STEP - DEPTH_ONE_STEP - 1; - - contextPtr->groupOf16x16BlocksCount = 0; - - // From the last coded pu index, get the indices of the left, top, and top left pus - leftCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP; - topCuIndex = leftCuIndex - DEPTH_ONE_STEP; - topLeftCuIndex = topCuIndex - DEPTH_ONE_STEP; - - // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation - // This needs to be done in the case that the N block was initially not calculated. - - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; - - // From the top left index, get the index of the candidate pu for merging - depthZeroCandidateCuIndex = topLeftCuIndex - 1; - - depthZeroCuStatsPtr = GetCodedUnitStats(depthZeroCandidateCuIndex); - if (depthZeroCuStatsPtr->depth == 0) { - - // Compute depth N cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 0, - &depthNRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - - // Inter depth comparison: depth 0 vs depth 1 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; - lastCuIndex = depthZeroCandidateCuIndex; - } - - - } - } - - return lastCuIndex; + EB_U32 lastCuIndex; + EB_U32 leftCuIndex; + EB_U32 topCuIndex; + EB_U32 topLeftCuIndex; + EB_U32 depthZeroCandidateCuIndex; + EB_U32 depthOneCandidateCuIndex = leafIndex; + EB_U32 depthTwoCandidateCuIndex = leafIndex; + EB_U64 depthNRate = 0; + EB_U64 depthNPlusOneRate = 0; + EB_U64 depthNCost = 0; + EB_U64 depthNPlusOneCost = 0; + EB_U32 cuOriginX; + EB_U32 cuOriginY; + EB_U32 tbMaxDepth = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + const CodedUnitStats_t *curCuStatsPtr; + const CodedUnitStats_t *depthTwoCuStatsPtr; + const CodedUnitStats_t *depthOneCuStatsPtr; + const CodedUnitStats_t *depthZeroCuStatsPtr; + + (void)lcuAddr; + lastCuIndex = leafIndex; + curCuStatsPtr = GetCodedUnitStats(leafIndex); + cuOriginX = tbOriginX + curCuStatsPtr->originX; + cuOriginY = tbOriginY + curCuStatsPtr->originY; + + + + //Parent is winner, update its cost, and trigger and inter-depth check-point. + EB_U64 SplitRate = 0; + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[leafIndex], + 0, + &SplitRate, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + sequenceControlSetPtr->maxLcuDepth); + + contextPtr->mdLocalCuUnit[leafIndex].cost += SplitRate; + + if (curCuStatsPtr->depth == 0) { + contextPtr->groupOf16x16BlocksCount = 0; + } + else if (curCuStatsPtr->depth == 1) { + contextPtr->groupOf16x16BlocksCount++; + contextPtr->groupOf8x8BlocksCount = 0; + } + else if (curCuStatsPtr->depth == 2) { + contextPtr->groupOf8x8BlocksCount++; + } + + + /*** Stage 0: Inter depth decision: depth 2 vs depth 3 ***/ + + // Walks to the last coded 8x8 block for merging + if ((GROUP_OF_4_8x8_BLOCKS(cuOriginX, cuOriginY))) { + + depthTwoCandidateCuIndex = leafIndex - DEPTH_THREE_STEP - DEPTH_THREE_STEP - DEPTH_THREE_STEP - 1; + + contextPtr->groupOf8x8BlocksCount++; + + // From the last coded cu index, get the indices of the left, top, and top left cus + leftCuIndex = leafIndex - DEPTH_THREE_STEP; + topCuIndex = leftCuIndex - DEPTH_THREE_STEP; + topLeftCuIndex = topCuIndex - DEPTH_THREE_STEP; + + // From the top left index, get the index of the candidate pu for merging + depthTwoCandidateCuIndex = topLeftCuIndex - 1; + + // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation + // This needs to be done in the case that the N block was initially not calculated. + + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + + // Compute depth N cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 0, + &depthNRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; + + depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[leafIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + + + // Inter depth comparison: depth 2 vs depth 3 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthTwoCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; + } + + + } + + // Stage 1: Inter depth decision: depth 1 vs depth 2 + + // Walks to the last coded 16x16 block for merging + depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); + cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; + cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; + + if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && + (contextPtr->groupOf8x8BlocksCount == 4)){ + + + depthOneCandidateCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP - DEPTH_TWO_STEP - DEPTH_TWO_STEP - 1; + + contextPtr->groupOf8x8BlocksCount = 0; + contextPtr->groupOf16x16BlocksCount++; + + // From the last coded pu index, get the indices of the left, top, and top left pus + leftCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP; + topCuIndex = leftCuIndex - DEPTH_TWO_STEP; + topLeftCuIndex = topCuIndex - DEPTH_TWO_STEP; + + // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation + // This needs to be done in the case that the N block was initially not calculated. + + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + + // From the top left index, get the index of the candidate pu for merging + depthOneCandidateCuIndex = topLeftCuIndex - 1; + + depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); + if (depthOneCuStatsPtr->depth == 1) { + + // Compute depth N cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 0, + &depthNRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + + + // Inter depth comparison: depth 1 vs depth 2 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthOneCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; + } + + + } + } + + // Stage 2: Inter depth decision: depth 0 vs depth 1 + + // Walks to the last coded 32x32 block for merging + // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates + depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); + cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; + cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; + if ((pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) + && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && + (contextPtr->groupOf16x16BlocksCount == 4)) { + + depthZeroCandidateCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP - DEPTH_ONE_STEP - DEPTH_ONE_STEP - 1; + + contextPtr->groupOf16x16BlocksCount = 0; + + // From the last coded pu index, get the indices of the left, top, and top left pus + leftCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP; + topCuIndex = leftCuIndex - DEPTH_ONE_STEP; + topLeftCuIndex = topCuIndex - DEPTH_ONE_STEP; + + // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation + // This needs to be done in the case that the N block was initially not calculated. + + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + + // From the top left index, get the index of the candidate pu for merging + depthZeroCandidateCuIndex = topLeftCuIndex - 1; + + depthZeroCuStatsPtr = GetCodedUnitStats(depthZeroCandidateCuIndex); + if (depthZeroCuStatsPtr->depth == 0) { + + // Compute depth N cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 0, + &depthNRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + + // Inter depth comparison: depth 0 vs depth 1 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; + lastCuIndex = depthZeroCandidateCuIndex; + } + + + } + } + + return lastCuIndex; } EB_BOOL StopSplitCondition( @@ -1403,7 +1403,7 @@ EB_BOOL StopSplitCondition( EB_BOOL stopSplitFlag = EB_TRUE; if ( pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL85_DEPTH_MODE || - pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL84_DEPTH_MODE || + pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL84_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_FULL85_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_FULL84_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_AVC_DEPTH_MODE)) ) { @@ -1413,9 +1413,9 @@ EB_BOOL StopSplitCondition( stopSplitFlag = EB_FALSE; } else{ - if (sequenceControlSetPtr->staticConfig.qp >= 20 && - pictureControlSetPtr->sliceType != EB_I_PICTURE && - pictureControlSetPtr->temporalLayerIndex == 0 && + if (sequenceControlSetPtr->staticConfig.qp >= 20 && + pictureControlSetPtr->sliceType != EB_I_PICTURE && + pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->ParentPcsPtr->logoPicFlag && pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuAddr].edgeBlockNum) { @@ -1443,8 +1443,8 @@ EB_BOOL StopSplitCondition( stopSplitFlag = (interSlice && (stopAtDepth0 || stopAtDepth1 || stopAtDepth2)) ? EB_TRUE : EB_FALSE; if (!lcuParams->isCompleteLcu || - pictureControlSetPtr->ParentPcsPtr->lcuIsolatedNonHomogeneousAreaArray[lcuAddr] || - (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE && pictureControlSetPtr->lcuPtrArray[lcuAddr]->auraStatus == AURA_STATUS_1)) { + pictureControlSetPtr->ParentPcsPtr->lcuIsolatedNonHomogeneousAreaArray[lcuAddr] || + (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE && pictureControlSetPtr->lcuPtrArray[lcuAddr]->auraStatus == AURA_STATUS_1)) { stopSplitFlag = EB_FALSE; } @@ -1509,7 +1509,7 @@ EB_U32 ProductPerformInterDepthDecision( leafIndex); if (lastDepthFlag || stopSplitFlag) { - tbPtr->codedLeafArrayPtr[leafIndex]->splitFlag = EB_FALSE; + tbPtr->codedLeafArrayPtr[leafIndex]->splitFlag = EB_FALSE; if (curCuStatsPtr->depth == 1) { @@ -1539,67 +1539,67 @@ EB_U32 ProductPerformInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; - - depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[leafIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - // Inter depth comparison: depth 2 vs depth 3 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthTwoCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; + + depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[leafIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + // Inter depth comparison: depth 2 vs depth 3 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthTwoCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; + } } - - // Stage 1: Inter depth decision: depth 1 vs depth 2 - + + // Stage 1: Inter depth decision: depth 1 vs depth 2 + // Walks to the last coded 16x16 block for merging depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; - if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && + if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && (contextPtr->groupOf8x8BlocksCount == 4 ) ){ depthOneCandidateCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP - DEPTH_TWO_STEP - DEPTH_TWO_STEP - 1; @@ -1615,10 +1615,10 @@ EB_U32 ProductPerformInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthOneCandidateCuIndex = topLeftCuIndex - 1; @@ -1627,75 +1627,75 @@ EB_U32 ProductPerformInterDepthDecision( if (depthOneCuStatsPtr->depth == 1) { // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; - - // Inter depth comparison: depth 1 vs depth 2 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthOneCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; + + // Inter depth comparison: depth 1 vs depth 2 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthOneCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; + } } } - // Stage 2: Inter depth decision: depth 0 vs depth 1 + // Stage 2: Inter depth decision: depth 0 vs depth 1 // Walks to the last coded 32x32 block for merging // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates @@ -1703,7 +1703,7 @@ EB_U32 ProductPerformInterDepthDecision( cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; if ((pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE ) - && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && + && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && (contextPtr->groupOf16x16BlocksCount == 4)) { depthZeroCandidateCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP - DEPTH_ONE_STEP - DEPTH_ONE_STEP - 1; @@ -1718,56 +1718,56 @@ EB_U32 ProductPerformInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthZeroCandidateCuIndex = topLeftCuIndex - 1; - + depthZeroCuStatsPtr = GetCodedUnitStats(depthZeroCandidateCuIndex); if (depthZeroCuStatsPtr->depth == 0) { - + // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; - - // Inter depth comparison: depth 0 vs depth 1 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; - lastCuIndex = depthZeroCandidateCuIndex; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; + + // Inter depth comparison: depth 0 vs depth 1 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; + lastCuIndex = depthZeroCandidateCuIndex; + } } @@ -1849,60 +1849,60 @@ EB_U32 PillarInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; - - depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[leafIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - // Inter depth comparison: depth 2 vs depth 3 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthTwoCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; + + depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[leafIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + // Inter depth comparison: depth 2 vs depth 3 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthTwoCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; + } } - // Stage 1: Inter depth decision: depth 1 vs depth 2 + // Stage 1: Inter depth decision: depth 1 vs depth 2 // Walks to the last coded 16x16 block for merging depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); @@ -1924,10 +1924,10 @@ EB_U32 PillarInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthOneCandidateCuIndex = topLeftCuIndex - 1; @@ -1936,74 +1936,74 @@ EB_U32 PillarInterDepthDecision( if (depthOneCuStatsPtr->depth == 1) { // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; - - // Inter depth comparison: depth 1 vs depth 2 - if (depthNCost <= depthNPlusOneCost) { - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthOneCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; + + // Inter depth comparison: depth 1 vs depth 2 + if (depthNCost <= depthNPlusOneCost) { + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthOneCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; + } } } - // Stage 2: Inter depth decision: depth 0 vs depth 1 + // Stage 2: Inter depth decision: depth 0 vs depth 1 // Walks to the last coded 32x32 block for merging // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates @@ -2026,10 +2026,10 @@ EB_U32 PillarInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthZeroCandidateCuIndex = topLeftCuIndex - 1; @@ -2038,44 +2038,44 @@ EB_U32 PillarInterDepthDecision( if (depthZeroCuStatsPtr->depth == 0) { // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; - - // Inter depth comparison: depth 0 vs depth 1 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; - lastCuIndex = depthZeroCandidateCuIndex; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; + + // Inter depth comparison: depth 0 vs depth 1 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; + lastCuIndex = depthZeroCandidateCuIndex; + } } } diff --git a/Source/Lib/Codec/EbFullLoop.h b/Source/Lib/Codec/EbFullLoop.h index f38dbf3bc..4f25d0e49 100644 --- a/Source/Lib/Codec/EbFullLoop.h +++ b/Source/Lib/Codec/EbFullLoop.h @@ -21,8 +21,8 @@ extern "C" { EB_U32 componentMask, EB_U32 cbQp, EB_U32 crQp, - EB_U32 *cbCountNonZeroCoeffs, - EB_U32 *crCountNonZeroCoeffs); + EB_U32 *cbCountNonZeroCoeffs, + EB_U32 *crCountNonZeroCoeffs); void CuFullDistortionFastTuMode_R( EbPictureBufferDesc_t *inputPicturePtr, @@ -30,12 +30,12 @@ extern "C" { LargestCodingUnit_t *lcuPtr, ModeDecisionCandidateBuffer_t *candidateBuffer, ModeDecisionContext_t *contextPtr, - ModeDecisionCandidate_t *candidatePtr, - const CodedUnitStats_t *cuStatsPtr, + ModeDecisionCandidate_t *candidatePtr, + const CodedUnitStats_t *cuStatsPtr, EB_U64 cbFullDistortion[DIST_CALC_TOTAL], EB_U64 crFullDistortion[DIST_CALC_TOTAL], EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU], - EB_U32 componentMask, + EB_U32 componentMask, EB_U64 *cbCoeffBits, EB_U64 *crCoeffBits); @@ -47,7 +47,7 @@ extern "C" { const CodedUnitStats_t *cuStatsPtr, PictureControlSet_t *pictureControlSetPtr, EB_U32 qp, - EB_U32 *yCountNonZeroCoeffs, + EB_U32 *yCountNonZeroCoeffs, EB_U64 *yCoeffBits, EB_U64 *yFullDistortion); @@ -62,16 +62,16 @@ extern "C" { MdRateEstimationContext_t *mdRateEstimationPtr, PictureControlSet_t *pictureControlSetPtr); - EB_U32 ExitInterDepthDecision( - ModeDecisionContext_t *contextPtr, - EB_U32 leafIndex, - LargestCodingUnit_t *tbPtr, - EB_U32 lcuAddr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_U64 fullLambda, - MdRateEstimationContext_t *mdRateEstimationPtr, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 ExitInterDepthDecision( + ModeDecisionContext_t *contextPtr, + EB_U32 leafIndex, + LargestCodingUnit_t *tbPtr, + EB_U32 lcuAddr, + EB_U32 tbOriginX, + EB_U32 tbOriginY, + EB_U64 fullLambda, + MdRateEstimationContext_t *mdRateEstimationPtr, + PictureControlSet_t *pictureControlSetPtr); extern EB_U32 PillarInterDepthDecision( ModeDecisionContext_t *contextPtr, @@ -86,4 +86,4 @@ extern "C" { #ifdef __cplusplus } #endif -#endif // EbFullLoop_h \ No newline at end of file +#endif // EbFullLoop_h diff --git a/Source/Lib/Codec/EbHmCode.c b/Source/Lib/Codec/EbHmCode.c index 279cb9d6a..c0ca51683 100644 --- a/Source/Lib/Codec/EbHmCode.c +++ b/Source/Lib/Codec/EbHmCode.c @@ -39,208 +39,208 @@ * returns 4x4 Sum of Absolute Transformed Differences *******************************************/ EB_U64 Compute4x4Satd( - EB_S16 *diff) // input parameter, diff samples Ptr + EB_S16 *diff) // input parameter, diff samples Ptr { - EB_U64 satdBlock4x4 = 0; - EB_S16 m[16], d[16]; - EB_U32 k; - - /*===== hadamard transform =====*/ - m[0] = diff[0] + diff[12]; - m[1] = diff[1] + diff[13]; - m[2] = diff[2] + diff[14]; - m[3] = diff[3] + diff[15]; - m[4] = diff[4] + diff[8]; - m[5] = diff[5] + diff[9]; - m[6] = diff[6] + diff[10]; - m[7] = diff[7] + diff[11]; - m[8] = diff[4] - diff[8]; - m[9] = diff[5] - diff[9]; - m[10] = diff[6] - diff[10]; - m[11] = diff[7] - diff[11]; - m[12] = diff[0] - diff[12]; - m[13] = diff[1] - diff[13]; - m[14] = diff[2] - diff[14]; - m[15] = diff[3] - diff[15]; - - d[0] = m[0] + m[4]; - d[1] = m[1] + m[5]; - d[2] = m[2] + m[6]; - d[3] = m[3] + m[7]; - d[4] = m[8] + m[12]; - d[5] = m[9] + m[13]; - d[6] = m[10] + m[14]; - d[7] = m[11] + m[15]; - d[8] = m[0] - m[4]; - d[9] = m[1] - m[5]; - d[10] = m[2] - m[6]; - d[11] = m[3] - m[7]; - d[12] = m[12] - m[8]; - d[13] = m[13] - m[9]; - d[14] = m[14] - m[10]; - d[15] = m[15] - m[11]; - - m[0] = d[0] + d[3]; - m[1] = d[1] + d[2]; - m[2] = d[1] - d[2]; - m[3] = d[0] - d[3]; - m[4] = d[4] + d[7]; - m[5] = d[5] + d[6]; - m[6] = d[5] - d[6]; - m[7] = d[4] - d[7]; - m[8] = d[8] + d[11]; - m[9] = d[9] + d[10]; - m[10] = d[9] - d[10]; - m[11] = d[8] - d[11]; - m[12] = d[12] + d[15]; - m[13] = d[13] + d[14]; - m[14] = d[13] - d[14]; - m[15] = d[12] - d[15]; - - d[0] = m[0] + m[1]; - d[1] = m[0] - m[1]; - d[2] = m[2] + m[3]; - d[3] = m[3] - m[2]; - d[4] = m[4] + m[5]; - d[5] = m[4] - m[5]; - d[6] = m[6] + m[7]; - d[7] = m[7] - m[6]; - d[8] = m[8] + m[9]; - d[9] = m[8] - m[9]; - d[10] = m[10] + m[11]; - d[11] = m[11] - m[10]; - d[12] = m[12] + m[13]; - d[13] = m[12] - m[13]; - d[14] = m[14] + m[15]; - d[15] = m[15] - m[14]; - - for (k = 0; k<16; ++k) { - satdBlock4x4 += ABS(d[k]); - } - - satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); - - return satdBlock4x4; + EB_U64 satdBlock4x4 = 0; + EB_S16 m[16], d[16]; + EB_U32 k; + + /*===== hadamard transform =====*/ + m[0] = diff[0] + diff[12]; + m[1] = diff[1] + diff[13]; + m[2] = diff[2] + diff[14]; + m[3] = diff[3] + diff[15]; + m[4] = diff[4] + diff[8]; + m[5] = diff[5] + diff[9]; + m[6] = diff[6] + diff[10]; + m[7] = diff[7] + diff[11]; + m[8] = diff[4] - diff[8]; + m[9] = diff[5] - diff[9]; + m[10] = diff[6] - diff[10]; + m[11] = diff[7] - diff[11]; + m[12] = diff[0] - diff[12]; + m[13] = diff[1] - diff[13]; + m[14] = diff[2] - diff[14]; + m[15] = diff[3] - diff[15]; + + d[0] = m[0] + m[4]; + d[1] = m[1] + m[5]; + d[2] = m[2] + m[6]; + d[3] = m[3] + m[7]; + d[4] = m[8] + m[12]; + d[5] = m[9] + m[13]; + d[6] = m[10] + m[14]; + d[7] = m[11] + m[15]; + d[8] = m[0] - m[4]; + d[9] = m[1] - m[5]; + d[10] = m[2] - m[6]; + d[11] = m[3] - m[7]; + d[12] = m[12] - m[8]; + d[13] = m[13] - m[9]; + d[14] = m[14] - m[10]; + d[15] = m[15] - m[11]; + + m[0] = d[0] + d[3]; + m[1] = d[1] + d[2]; + m[2] = d[1] - d[2]; + m[3] = d[0] - d[3]; + m[4] = d[4] + d[7]; + m[5] = d[5] + d[6]; + m[6] = d[5] - d[6]; + m[7] = d[4] - d[7]; + m[8] = d[8] + d[11]; + m[9] = d[9] + d[10]; + m[10] = d[9] - d[10]; + m[11] = d[8] - d[11]; + m[12] = d[12] + d[15]; + m[13] = d[13] + d[14]; + m[14] = d[13] - d[14]; + m[15] = d[12] - d[15]; + + d[0] = m[0] + m[1]; + d[1] = m[0] - m[1]; + d[2] = m[2] + m[3]; + d[3] = m[3] - m[2]; + d[4] = m[4] + m[5]; + d[5] = m[4] - m[5]; + d[6] = m[6] + m[7]; + d[7] = m[7] - m[6]; + d[8] = m[8] + m[9]; + d[9] = m[8] - m[9]; + d[10] = m[10] + m[11]; + d[11] = m[11] - m[10]; + d[12] = m[12] + m[13]; + d[13] = m[12] - m[13]; + d[14] = m[14] + m[15]; + d[15] = m[15] - m[14]; + + for (k = 0; k<16; ++k) { + satdBlock4x4 += ABS(d[k]); + } + + satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); + + return satdBlock4x4; } EB_U64 Compute4x4Satd_U8( - EB_U8 *src, // input parameter, diff samples Ptr - EB_U64 *dcValue, - EB_U32 srcStride) + EB_U8 *src, // input parameter, diff samples Ptr + EB_U64 *dcValue, + EB_U32 srcStride) { - EB_U64 satdBlock4x4 = 0; - EB_S16 m[16], d[16]; - EB_U32 k; - - /*===== hadamard transform =====*/ - m[0] = src[0] + src[3 * srcStride]; - m[1] = src[1] + src[1 + (3 * srcStride)]; - m[2] = src[2] + src[2 + (3 * srcStride)]; - m[3] = src[3] + src[3 + (3 * srcStride)]; - m[4] = src[srcStride] + src[2 * srcStride]; - m[5] = src[1 + srcStride] + src[1 + (2 * srcStride)]; - m[6] = src[2 + srcStride] + src[2 + (2 * srcStride)]; - m[7] = src[3 + srcStride] + src[3 + (2 * srcStride)]; - m[8] = src[srcStride] - src[2 * srcStride]; - m[9] = src[1 + srcStride] - src[1 + (2 * srcStride)]; - m[10] = src[2 + srcStride] - src[2 + (2 * srcStride)]; - m[11] = src[3 + srcStride] - src[3 + (2 * srcStride)]; - m[12] = src[0] - src[3 * srcStride]; - m[13] = src[1] - src[1 + (3 * srcStride)]; - m[14] = src[2] - src[2 + (3 * srcStride)]; - m[15] = src[3] - src[3 + (3 * srcStride)]; - - d[0] = m[0] + m[4]; - d[1] = m[1] + m[5]; - d[2] = m[2] + m[6]; - d[3] = m[3] + m[7]; - d[4] = m[8] + m[12]; - d[5] = m[9] + m[13]; - d[6] = m[10] + m[14]; - d[7] = m[11] + m[15]; - d[8] = m[0] - m[4]; - d[9] = m[1] - m[5]; - d[10] = m[2] - m[6]; - d[11] = m[3] - m[7]; - d[12] = m[12] - m[8]; - d[13] = m[13] - m[9]; - d[14] = m[14] - m[10]; - d[15] = m[15] - m[11]; - - m[0] = d[0] + d[3]; - m[1] = d[1] + d[2]; - m[2] = d[1] - d[2]; - m[3] = d[0] - d[3]; - m[4] = d[4] + d[7]; - m[5] = d[5] + d[6]; - m[6] = d[5] - d[6]; - m[7] = d[4] - d[7]; - m[8] = d[8] + d[11]; - m[9] = d[9] + d[10]; - m[10] = d[9] - d[10]; - m[11] = d[8] - d[11]; - m[12] = d[12] + d[15]; - m[13] = d[13] + d[14]; - m[14] = d[13] - d[14]; - m[15] = d[12] - d[15]; - - d[0] = m[0] + m[1]; - d[1] = m[0] - m[1]; - d[2] = m[2] + m[3]; - d[3] = m[3] - m[2]; - d[4] = m[4] + m[5]; - d[5] = m[4] - m[5]; - d[6] = m[6] + m[7]; - d[7] = m[7] - m[6]; - d[8] = m[8] + m[9]; - d[9] = m[8] - m[9]; - d[10] = m[10] + m[11]; - d[11] = m[11] - m[10]; - d[12] = m[12] + m[13]; - d[13] = m[12] - m[13]; - d[14] = m[14] + m[15]; - d[15] = m[15] - m[14]; - - for (k = 0; k<16; ++k) { - satdBlock4x4 += ABS(d[k]); - } - - satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); - *dcValue += d[0]; - return satdBlock4x4; + EB_U64 satdBlock4x4 = 0; + EB_S16 m[16], d[16]; + EB_U32 k; + + /*===== hadamard transform =====*/ + m[0] = src[0] + src[3 * srcStride]; + m[1] = src[1] + src[1 + (3 * srcStride)]; + m[2] = src[2] + src[2 + (3 * srcStride)]; + m[3] = src[3] + src[3 + (3 * srcStride)]; + m[4] = src[srcStride] + src[2 * srcStride]; + m[5] = src[1 + srcStride] + src[1 + (2 * srcStride)]; + m[6] = src[2 + srcStride] + src[2 + (2 * srcStride)]; + m[7] = src[3 + srcStride] + src[3 + (2 * srcStride)]; + m[8] = src[srcStride] - src[2 * srcStride]; + m[9] = src[1 + srcStride] - src[1 + (2 * srcStride)]; + m[10] = src[2 + srcStride] - src[2 + (2 * srcStride)]; + m[11] = src[3 + srcStride] - src[3 + (2 * srcStride)]; + m[12] = src[0] - src[3 * srcStride]; + m[13] = src[1] - src[1 + (3 * srcStride)]; + m[14] = src[2] - src[2 + (3 * srcStride)]; + m[15] = src[3] - src[3 + (3 * srcStride)]; + + d[0] = m[0] + m[4]; + d[1] = m[1] + m[5]; + d[2] = m[2] + m[6]; + d[3] = m[3] + m[7]; + d[4] = m[8] + m[12]; + d[5] = m[9] + m[13]; + d[6] = m[10] + m[14]; + d[7] = m[11] + m[15]; + d[8] = m[0] - m[4]; + d[9] = m[1] - m[5]; + d[10] = m[2] - m[6]; + d[11] = m[3] - m[7]; + d[12] = m[12] - m[8]; + d[13] = m[13] - m[9]; + d[14] = m[14] - m[10]; + d[15] = m[15] - m[11]; + + m[0] = d[0] + d[3]; + m[1] = d[1] + d[2]; + m[2] = d[1] - d[2]; + m[3] = d[0] - d[3]; + m[4] = d[4] + d[7]; + m[5] = d[5] + d[6]; + m[6] = d[5] - d[6]; + m[7] = d[4] - d[7]; + m[8] = d[8] + d[11]; + m[9] = d[9] + d[10]; + m[10] = d[9] - d[10]; + m[11] = d[8] - d[11]; + m[12] = d[12] + d[15]; + m[13] = d[13] + d[14]; + m[14] = d[13] - d[14]; + m[15] = d[12] - d[15]; + + d[0] = m[0] + m[1]; + d[1] = m[0] - m[1]; + d[2] = m[2] + m[3]; + d[3] = m[3] - m[2]; + d[4] = m[4] + m[5]; + d[5] = m[4] - m[5]; + d[6] = m[6] + m[7]; + d[7] = m[7] - m[6]; + d[8] = m[8] + m[9]; + d[9] = m[8] - m[9]; + d[10] = m[10] + m[11]; + d[11] = m[11] - m[10]; + d[12] = m[12] + m[13]; + d[13] = m[12] - m[13]; + d[14] = m[14] + m[15]; + d[15] = m[15] - m[14]; + + for (k = 0; k<16; ++k) { + satdBlock4x4 += ABS(d[k]); + } + + satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); + *dcValue += d[0]; + return satdBlock4x4; } //Table for updating the next state. MPS and LSP tables are combined. The higher bit would decide for MPS or LPS. 128 MPS and then 128 LPS //8 bits unsigned would be enough const EB_U32 NextStateMpsLps[] = { - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 124, 125, 126, 127, - 1, 0, 0, 1, 2, 3, 4, 5, 4, 5, 8, 9, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 18, 19, 22, 23, 22, 23, 24, 25, - 26, 27, 26, 27, 30, 31, 30, 31, 32, 33, 32, 33, 36, 37, 36, 37, - 38, 39, 38, 39, 42, 43, 42, 43, 44, 45, 44, 45, 46, 47, 48, 49, - 48, 49, 50, 51, 52, 53, 52, 53, 54, 55, 54, 55, 56, 57, 58, 59, - 58, 59, 60, 61, 60, 61, 60, 61, 62, 63, 64, 65, 64, 65, 66, 67, - 66, 67, 66, 67, 68, 69, 68, 69, 70, 71, 70, 71, 70, 71, 72, 73, - 72, 73, 72, 73, 74, 75, 74, 75, 74, 75, 76, 77, 76, 77, 126, 127 + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 124, 125, 126, 127, + 1, 0, 0, 1, 2, 3, 4, 5, 4, 5, 8, 9, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 18, 19, 22, 23, 22, 23, 24, 25, + 26, 27, 26, 27, 30, 31, 30, 31, 32, 33, 32, 33, 36, 37, 36, 37, + 38, 39, 38, 39, 42, 43, 42, 43, 44, 45, 44, 45, 46, 47, 48, 49, + 48, 49, 50, 51, 52, 53, 52, 53, 54, 55, 54, 55, 56, 57, 58, 59, + 58, 59, 60, 61, 60, 61, 60, 61, 62, 63, 64, 65, 64, 65, 66, 67, + 66, 67, 66, 67, 68, 69, 68, 69, 70, 71, 70, 71, 70, 71, 72, 73, + 72, 73, 72, 73, 74, 75, 74, 75, 74, 75, 76, 77, 76, 77, 126, 127 }; -const EB_U32 CabacEstimatedBits[] = +const EB_U32 CabacEstimatedBits[] = { - 0x07b23, 0x085f9, 0x074a0, 0x08cbc, 0x06ee4, 0x09354, 0x067f4, 0x09c1b, 0x060b0, 0x0a62a, 0x05a9c, 0x0af5b, 0x0548d, 0x0b955, 0x04f56, 0x0c2a9, - 0x04a87, 0x0cbf7, 0x045d6, 0x0d5c3, 0x04144, 0x0e01b, 0x03d88, 0x0e937, 0x039e0, 0x0f2cd, 0x03663, 0x0fc9e, 0x03347, 0x10600, 0x03050, 0x10f95, - 0x02d4d, 0x11a02, 0x02ad3, 0x12333, 0x0286e, 0x12cad, 0x02604, 0x136df, 0x02425, 0x13f48, 0x021f4, 0x149c4, 0x0203e, 0x1527b, 0x01e4d, 0x15d00, - 0x01c99, 0x166de, 0x01b18, 0x17017, 0x019a5, 0x17988, 0x01841, 0x18327, 0x016df, 0x18d50, 0x015d9, 0x19547, 0x0147c, 0x1a083, 0x0138e, 0x1a8a3, - 0x01251, 0x1b418, 0x01166, 0x1bd27, 0x01068, 0x1c77b, 0x00f7f, 0x1d18e, 0x00eda, 0x1d91a, 0x00e19, 0x1e254, 0x00d4f, 0x1ec9a, 0x00c90, 0x1f6e0, - 0x00c01, 0x1fef8, 0x00b5f, 0x208b1, 0x00ab6, 0x21362, 0x00a15, 0x21e46, 0x00988, 0x2285d, 0x00934, 0x22ea8, 0x008a8, 0x239b2, 0x0081d, 0x24577, - 0x007c9, 0x24ce6, 0x00763, 0x25663, 0x00710, 0x25e8f, 0x006a0, 0x26a26, 0x00672, 0x26f23, 0x005e8, 0x27ef8, 0x005ba, 0x284b5, 0x0055e, 0x29057, - 0x0050c, 0x29bab, 0x004c1, 0x2a674, 0x004a7, 0x2aa5e, 0x0046f, 0x2b32f, 0x0041f, 0x2c0ad, 0x003e7, 0x2ca8d, 0x003ba, 0x2d323, 0x0010c, 0x3bfbb + 0x07b23, 0x085f9, 0x074a0, 0x08cbc, 0x06ee4, 0x09354, 0x067f4, 0x09c1b, 0x060b0, 0x0a62a, 0x05a9c, 0x0af5b, 0x0548d, 0x0b955, 0x04f56, 0x0c2a9, + 0x04a87, 0x0cbf7, 0x045d6, 0x0d5c3, 0x04144, 0x0e01b, 0x03d88, 0x0e937, 0x039e0, 0x0f2cd, 0x03663, 0x0fc9e, 0x03347, 0x10600, 0x03050, 0x10f95, + 0x02d4d, 0x11a02, 0x02ad3, 0x12333, 0x0286e, 0x12cad, 0x02604, 0x136df, 0x02425, 0x13f48, 0x021f4, 0x149c4, 0x0203e, 0x1527b, 0x01e4d, 0x15d00, + 0x01c99, 0x166de, 0x01b18, 0x17017, 0x019a5, 0x17988, 0x01841, 0x18327, 0x016df, 0x18d50, 0x015d9, 0x19547, 0x0147c, 0x1a083, 0x0138e, 0x1a8a3, + 0x01251, 0x1b418, 0x01166, 0x1bd27, 0x01068, 0x1c77b, 0x00f7f, 0x1d18e, 0x00eda, 0x1d91a, 0x00e19, 0x1e254, 0x00d4f, 0x1ec9a, 0x00c90, 0x1f6e0, + 0x00c01, 0x1fef8, 0x00b5f, 0x208b1, 0x00ab6, 0x21362, 0x00a15, 0x21e46, 0x00988, 0x2285d, 0x00934, 0x22ea8, 0x008a8, 0x239b2, 0x0081d, 0x24577, + 0x007c9, 0x24ce6, 0x00763, 0x25663, 0x00710, 0x25e8f, 0x006a0, 0x26a26, 0x00672, 0x26f23, 0x005e8, 0x27ef8, 0x005ba, 0x284b5, 0x0055e, 0x29057, + 0x0050c, 0x29bab, 0x004c1, 0x2a674, 0x004a7, 0x2aa5e, 0x0046f, 0x2b32f, 0x0041f, 0x2c0ad, 0x003e7, 0x2ca8d, 0x003ba, 0x2d323, 0x0010c, 0x3bfbb }; diff --git a/Source/Lib/Codec/EbHmCode.h b/Source/Lib/Codec/EbHmCode.h index 66f63745c..c671651ce 100644 --- a/Source/Lib/Codec/EbHmCode.h +++ b/Source/Lib/Codec/EbHmCode.h @@ -41,18 +41,18 @@ extern "C" { EB_U64 Compute4x4Satd( - EB_S16 *diff); + EB_S16 *diff); EB_U64 Compute4x4Satd_U8( - EB_U8 *src, - EB_U64 *dcValue, - EB_U32 srcStride); + EB_U8 *src, + EB_U64 *dcValue, + EB_U32 srcStride); extern const EB_U32 NextStateMpsLps[]; extern const EB_U32 CabacEstimatedBits[]; #ifdef __cplusplus } -#endif -#endif // EbHmCode_h \ No newline at end of file +#endif +#endif // EbHmCode_h diff --git a/Source/Lib/Codec/EbInitialRateControlProcess.h b/Source/Lib/Codec/EbInitialRateControlProcess.h index 2bd9051ba..5d7b1abf2 100644 --- a/Source/Lib/Codec/EbInitialRateControlProcess.h +++ b/Source/Lib/Codec/EbInitialRateControlProcess.h @@ -18,9 +18,9 @@ extern "C" { * Context **************************************/ typedef struct InitialRateControlContext_s -{ +{ EbFifo_t *motionEstimationResultsInputFifoPtr; - EbFifo_t *initialrateControlResultsOutputFifoPtr; + EbFifo_t *initialrateControlResultsOutputFifoPtr; } InitialRateControlContext_t; @@ -31,7 +31,7 @@ extern EB_ERRORTYPE InitialRateControlContextCtor( InitialRateControlContext_t **contextDblPtr, EbFifo_t *motionEstimationResultsInputFifoPtr, EbFifo_t *pictureDemuxResultsOutputFifoPtr); - + extern void* InitialRateControlKernel(void *inputPtr); extern void MeBasedGlobalMotionDetection( diff --git a/Source/Lib/Codec/EbInitialRateControlReorderQueue.c b/Source/Lib/Codec/EbInitialRateControlReorderQueue.c index 70c28390c..d75804eb1 100644 --- a/Source/Lib/Codec/EbInitialRateControlReorderQueue.c +++ b/Source/Lib/Codec/EbInitialRateControlReorderQueue.c @@ -6,7 +6,7 @@ #include #include "EbInitialRateControlReorderQueue.h" -EB_ERRORTYPE InitialRateControlReorderEntryCtor( +EB_ERRORTYPE InitialRateControlReorderEntryCtor( InitialRateControlReorderEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -14,12 +14,12 @@ EB_ERRORTYPE InitialRateControlReorderEntryCtor( (*entryDblPtr)->pictureNumber = pictureNumber; (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - + return EB_ErrorNone; } -EB_ERRORTYPE HlRateControlHistogramEntryCtor( +EB_ERRORTYPE HlRateControlHistogramEntryCtor( HlRateControlHistogramEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -30,7 +30,7 @@ EB_ERRORTYPE HlRateControlHistogramEntryCtor( (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - // ME and OIS Distortion Histograms + // ME and OIS Distortion Histograms EB_MALLOC(EB_U16*, (*entryDblPtr)->meDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_SAD_INTERVALS, EB_N_PTR); EB_MALLOC(EB_U16*, (*entryDblPtr)->oisDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_INTRA_SAD_INTERVALS, EB_N_PTR); diff --git a/Source/Lib/Codec/EbInitialRateControlReorderQueue.h b/Source/Lib/Codec/EbInitialRateControlReorderQueue.h index b62982e03..f400648e6 100644 --- a/Source/Lib/Codec/EbInitialRateControlReorderQueue.h +++ b/Source/Lib/Codec/EbInitialRateControlReorderQueue.h @@ -17,11 +17,11 @@ extern "C" { * Initial Rate Control Reorder Queue Entry ************************************************/ typedef struct InitialRateControlReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *parentPcsWrapperPtr; -} InitialRateControlReorderEntry_t; +} InitialRateControlReorderEntry_t; -extern EB_ERRORTYPE InitialRateControlReorderEntryCtor( +extern EB_ERRORTYPE InitialRateControlReorderEntryCtor( InitialRateControlReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); @@ -30,25 +30,25 @@ extern EB_ERRORTYPE InitialRateControlReorderEntryCtor( * High Level Rate Control Histogram Queue Entry ************************************************/ typedef struct HlRateControlHistogramEntry_s { - EB_U64 pictureNumber; - EB_S16 lifeCount; + EB_U64 pictureNumber; + EB_S16 lifeCount; EB_BOOL passedToHlrc; EB_BOOL isCoded; EB_U64 totalNumBitsCoded; EbObjectWrapper_t *parentPcsWrapperPtr; - EB_BOOL endOfSequenceFlag; + EB_BOOL endOfSequenceFlag; EB_U64 predBitsRefQp[MAX_REF_QP_NUM]; - EB_PICTURE sliceType; - EB_U32 temporalLayerIndex; + EB_PICTURE sliceType; + EB_U32 temporalLayerIndex; - - // Motion Estimation Distortion and OIS Historgram + + // Motion Estimation Distortion and OIS Historgram EB_U16 *meDistortionHistogram; EB_U16 *oisDistortionHistogram; EB_U32 fullLcuCount; -} HlRateControlHistogramEntry_t; +} HlRateControlHistogramEntry_t; -extern EB_ERRORTYPE HlRateControlHistogramEntryCtor( +extern EB_ERRORTYPE HlRateControlHistogramEntryCtor( HlRateControlHistogramEntry_t **entryDblPtr, EB_U32 pictureNumber); diff --git a/Source/Lib/Codec/EbInitialRateControlResults.c b/Source/Lib/Codec/EbInitialRateControlResults.c index 82a5d97bd..702769fe2 100644 --- a/Source/Lib/Codec/EbInitialRateControlResults.c +++ b/Source/Lib/Codec/EbInitialRateControlResults.c @@ -8,7 +8,7 @@ #include "EbInitialRateControlResults.h" EB_ERRORTYPE InitialRateControlResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { InitialRateControlResults_t *objectPtr; @@ -17,7 +17,7 @@ EB_ERRORTYPE InitialRateControlResultsCtor( *objectDblPtr = (EB_PTR) objectPtr; objectInitDataPtr = 0; (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbInitialRateControlResults.h b/Source/Lib/Codec/EbInitialRateControlResults.h index cf83ab1e7..954d218ee 100644 --- a/Source/Lib/Codec/EbInitialRateControlResults.h +++ b/Source/Lib/Codec/EbInitialRateControlResults.h @@ -28,11 +28,11 @@ typedef struct InitialRateControlResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE InitialRateControlResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + #ifdef __cplusplus } #endif -#endif //EbInitialRateControlResults_h \ No newline at end of file +#endif //EbInitialRateControlResults_h diff --git a/Source/Lib/Codec/EbInterPrediction.c b/Source/Lib/Codec/EbInterPrediction.c index 25364a86b..74b7e5a66 100644 --- a/Source/Lib/Codec/EbInterPrediction.c +++ b/Source/Lib/Codec/EbInterPrediction.c @@ -20,7 +20,7 @@ EB_ERRORTYPE InterPredictionContextCtor( InterPredictionContext_t **interPredictionContext, - EB_U16 maxCUWidth, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit) @@ -45,13 +45,13 @@ EB_ERRORTYPE InterPredictionContextCtor( void RoundMvOnTheFly( - EB_S16 *motionVector_x, - EB_S16 *motionVector_y) + EB_S16 *motionVector_x, + EB_S16 *motionVector_y) { - *motionVector_x = (*motionVector_x + 2)&~0x03; - *motionVector_y = (*motionVector_y + 2)&~0x03; + *motionVector_x = (*motionVector_x + 2)&~0x03; + *motionVector_y = (*motionVector_y + 2)&~0x03; - return; + return; } @@ -250,7 +250,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( puOriginIndex, puChromaOriginIndex, componentMask, - contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf0); + contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf0); } @@ -392,7 +392,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( componentMask, contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf0, contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf1, - contextPtr->mcpContext->avcStyleMcpTwoDInterpolationFirstPassFilterResultBuf); + contextPtr->mcpContext->avcStyleMcpTwoDInterpolationFirstPassFilterResultBuf); } break; @@ -413,57 +413,57 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( * PreLoad Reference Block for 16bit mode ***************************************************/ void UnPackReferenceBlock( - EbPictureBufferDesc_t *refFramePic, - EB_U32 posX, - EB_U32 posY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *dst, - EB_U32 componentMask) + EbPictureBufferDesc_t *refFramePic, + EB_U32 posX, + EB_U32 posY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *dst, + EB_U32 componentMask) { - puWidth += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation - puHeight += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation - EB_U32 inPosx = (posX >> 2) - 4; // -4 to account for 8-tap interpolation - EB_U32 inPosy = (posY >> 2) - 4; // -4 to account for 8-tap interpolation - EB_U16 *ptr16; - - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - ptr16 = (EB_U16 *)refFramePic->bufferY + inPosx + inPosy*refFramePic->strideY; - - Extract8BitdataSafeSub( - ptr16, - refFramePic->strideY, - dst->bufferY, - dst->strideY, - puWidth, - puHeight - ); - } - - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - ptr16 = (EB_U16 *)refFramePic->bufferCb + (inPosx >> 1) + (inPosy >> 1) * refFramePic->strideCb; - - Extract8BitdataSafeSub( - ptr16, - refFramePic->strideCb, - dst->bufferCb, - dst->strideCb, - puWidth >> 1, - puHeight >> 1 - ); - - ptr16 = (EB_U16 *)refFramePic->bufferCr + (inPosx >> 1) + (inPosy >> 1) *refFramePic->strideCr; - - Extract8BitdataSafeSub( - ptr16, - refFramePic->strideCr, - dst->bufferCr, - dst->strideCr, - puWidth >> 1, - puHeight >> 1 - ); - } + puWidth += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation + puHeight += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation + EB_U32 inPosx = (posX >> 2) - 4; // -4 to account for 8-tap interpolation + EB_U32 inPosy = (posY >> 2) - 4; // -4 to account for 8-tap interpolation + EB_U16 *ptr16; + + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + ptr16 = (EB_U16 *)refFramePic->bufferY + inPosx + inPosy*refFramePic->strideY; + + Extract8BitdataSafeSub( + ptr16, + refFramePic->strideY, + dst->bufferY, + dst->strideY, + puWidth, + puHeight + ); + } + + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + ptr16 = (EB_U16 *)refFramePic->bufferCb + (inPosx >> 1) + (inPosy >> 1) * refFramePic->strideCb; + + Extract8BitdataSafeSub( + ptr16, + refFramePic->strideCb, + dst->bufferCb, + dst->strideCb, + puWidth >> 1, + puHeight >> 1 + ); + + ptr16 = (EB_U16 *)refFramePic->bufferCr + (inPosx >> 1) + (inPosy >> 1) *refFramePic->strideCr; + + Extract8BitdataSafeSub( + ptr16, + refFramePic->strideCr, + dst->bufferCr, + dst->strideCr, + puWidth >> 1, + puHeight >> 1 + ); + } } @@ -492,7 +492,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); EB_U32 puChromaOriginIndex = ((((puOriginY & (63)) * 32) + (puOriginX & (63))) >> 1); - + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; @@ -509,13 +509,13 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( // Setup List 0 if (candidateBufferPtr->candidatePtr->predictionDirection[puIndex] == UNI_PRED_LIST_0 || candidateBufferPtr->candidatePtr->predictionDirection[puIndex] == BI_PRED) { - + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; if (mdContextPtr->cuUseRefSrcFlag) refPicList0 = referenceObject->refDenSrcPicture; else - refPicList0 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture ; + refPicList0 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture ; motionVector_x = candidateBufferPtr->candidatePtr->motionVector_x_L0; @@ -552,7 +552,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( if (mdContextPtr->cuUseRefSrcFlag) refPicList1 = referenceObject->refDenSrcPicture; else - refPicList1 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture; + refPicList1 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture; motionVector_x = candidateBufferPtr->candidatePtr->motionVector_x_L1; @@ -585,30 +585,30 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( case UNI_PRED_LIST_0: - if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { + if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { if (refPicList0) - UnPackReferenceBlock( - refPicList0, - refList0PosX, - refList0PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL0, - componentMask); - - UniPredHevcInterpolationMd( - contextPtr->mcpContext->localReferenceBlock8BITL0, - refList0PosX, - refList0PosY, - puWidth, - puHeight, - candidateBufferPtr->predictionPtr, - puOriginIndex, - puChromaOriginIndex, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, - contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, - EB_TRUE, - componentMask); + UnPackReferenceBlock( + refPicList0, + refList0PosX, + refList0PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL0, + componentMask); + + UniPredHevcInterpolationMd( + contextPtr->mcpContext->localReferenceBlock8BITL0, + refList0PosX, + refList0PosY, + puWidth, + puHeight, + candidateBufferPtr->predictionPtr, + puOriginIndex, + puChromaOriginIndex, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, + contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, + EB_TRUE, + componentMask); } else { @@ -633,30 +633,30 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( case UNI_PRED_LIST_1: - if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { + if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { if (refPicList1) - UnPackReferenceBlock( - refPicList1, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL1, - componentMask); - - UniPredHevcInterpolationMd( - contextPtr->mcpContext->localReferenceBlock8BITL1, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - candidateBufferPtr->predictionPtr, - puOriginIndex, - puChromaOriginIndex, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, - contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, - EB_TRUE, - componentMask); + UnPackReferenceBlock( + refPicList1, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL1, + componentMask); + + UniPredHevcInterpolationMd( + contextPtr->mcpContext->localReferenceBlock8BITL1, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + candidateBufferPtr->predictionPtr, + puOriginIndex, + puChromaOriginIndex, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, + contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, + EB_TRUE, + componentMask); } else { @@ -681,44 +681,44 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( case BI_PRED: - if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { + if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { if (refPicList0) - UnPackReferenceBlock( - refPicList0, - refList0PosX, - refList0PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL0, - componentMask); + UnPackReferenceBlock( + refPicList0, + refList0PosX, + refList0PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL0, + componentMask); if (refPicList1) - UnPackReferenceBlock( - refPicList1, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL1, - componentMask); - - BiPredHevcInterpolationMd( - contextPtr->mcpContext->localReferenceBlock8BITL0, - contextPtr->mcpContext->localReferenceBlock8BITL1, - refList0PosX, - refList0PosY, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - candidateBufferPtr->predictionPtr, - puOriginIndex, - puChromaOriginIndex, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf1, - contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, - EB_TRUE, - componentMask); + UnPackReferenceBlock( + refPicList1, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL1, + componentMask); + + BiPredHevcInterpolationMd( + contextPtr->mcpContext->localReferenceBlock8BITL0, + contextPtr->mcpContext->localReferenceBlock8BITL1, + refList0PosX, + refList0PosY, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + candidateBufferPtr->predictionPtr, + puOriginIndex, + puChromaOriginIndex, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf1, + contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, + EB_TRUE, + componentMask); } @@ -760,11 +760,11 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( * Inter Prediction used in the Encode Pass ***************************************************/ EB_ERRORTYPE EncodePassInterPrediction( - MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + MvUnit_t *mvUnit, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, @@ -774,10 +774,10 @@ EB_ERRORTYPE EncodePassInterPrediction( EbPictureBufferDesc_t *refPicList0 = 0; EbPictureBufferDesc_t *refPicList1 = 0; EbReferenceObject_t *referenceObject; - EB_U16 refList0PosX = 0; - EB_U16 refList0PosY = 0; - EB_U16 refList1PosX = 0; - EB_U16 refList1PosY = 0; + EB_U16 refList0PosX = 0; + EB_U16 refList0PosY = 0; + EB_U16 refList1PosX = 0; + EB_U16 refList1PosY = 0; EB_COLOR_FORMAT colorFormat=predictionPtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -786,7 +786,7 @@ EB_ERRORTYPE EncodePassInterPrediction( EB_U32 puOriginIndex = ((predictionPtr->originY +puOriginY) * predictionPtr->strideY) + (predictionPtr->originX+puOriginX); EB_U32 puChromaOriginIndex = (((predictionPtr->originY+puOriginY) * predictionPtr->strideCb) >> subHeightCMinus1) + ((predictionPtr->originX+puOriginX) >> subWidthCMinus1); SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; + EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; // Setup List 0 if(mvUnit->predDirection == UNI_PRED_LIST_0 || mvUnit->predDirection == BI_PRED) { @@ -809,12 +809,12 @@ EB_ERRORTYPE EncodePassInterPrediction( CHECK_REPORT_ERROR( (refList0PosX < ((refPicList0->width + (refPicList0->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); CHECK_REPORT_ERROR( (refList0PosY < ((refPicList0->height + (refPicList0->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); } @@ -845,12 +845,12 @@ EB_ERRORTYPE EncodePassInterPrediction( CHECK_REPORT_ERROR( (refList1PosX < ((refPicList1->width + (refPicList1->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); CHECK_REPORT_ERROR( (refList1PosY < ((refPicList1->height + (refPicList1->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); } @@ -914,7 +914,7 @@ EB_ERRORTYPE EncodePassInterPrediction( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_PRED_ERROR0); break; } @@ -928,10 +928,10 @@ EB_ERRORTYPE EncodePassInterPrediction( ***************************************************/ EB_ERRORTYPE EncodePassInterPrediction16bit( MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, MotionCompensationPredictionContext_t *mcpContext) @@ -941,10 +941,10 @@ EB_ERRORTYPE EncodePassInterPrediction16bit( EbPictureBufferDesc_t *refPicList0 = 0; EbPictureBufferDesc_t *refPicList1 = 0; EbReferenceObject_t *referenceObject; - EB_U16 refList0PosX = 0; - EB_U16 refList0PosY = 0; - EB_U16 refList1PosX = 0; - EB_U16 refList1PosY = 0; + EB_U16 refList0PosX = 0; + EB_U16 refList0PosY = 0; + EB_U16 refList1PosX = 0; + EB_U16 refList1PosY = 0; const EB_COLOR_FORMAT colorFormat = predictionPtr->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; @@ -955,93 +955,93 @@ EB_ERRORTYPE EncodePassInterPrediction16bit( EB_U32 puChromaOriginIndex = ((predictionPtr->originX + puOriginX) >> subWidthCMinus1) + (((predictionPtr->originY+puOriginY) * predictionPtr->strideCb) >> subHeightCMinus1); SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; - - // Setup List 0 - if (mvUnit->predDirection == UNI_PRED_LIST_0 || mvUnit->predDirection == BI_PRED) { - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; - refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; - - // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 - //refList0PosX = (EB_U32) CLIP3((EB_S32)((refPicList0->originX-71) << 2), (EB_S32)((refPicList0->width + refPicList0->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList0->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_0][puIndex]); - refList0PosX = (EB_U32)CLIP3( - (EB_S32)((refPicList0->originX - 71) << 2), - (EB_S32)((refPicList0->width + refPicList0->originX + 7) << 2), - (EB_S32)((puOriginX + refPicList0->originX) << 2) + mvUnit->mv[REF_LIST_0].x); - //refList0PosY = (EB_U32) CLIP3((EB_S32)((refPicList0->originY-71) << 2),(EB_S32)((refPicList0->height + refPicList0->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList0->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_0][puIndex]); - refList0PosY = (EB_U32)CLIP3( - (EB_S32)((refPicList0->originY - 71) << 2), - (EB_S32)((refPicList0->height + refPicList0->originY + 7) << 2), - (EB_S32)((puOriginY + refPicList0->originY) << 2) + mvUnit->mv[REF_LIST_0].y); - - - CHECK_REPORT_ERROR( - (refList0PosX < ((refPicList0->width + (refPicList0->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - CHECK_REPORT_ERROR( - (refList0PosY < ((refPicList0->height + (refPicList0->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - EB_U32 lumaOffSet = ((refList0PosX >> 2) - 4) * 2 + ((refList0PosY >> 2) - 4) * 2 * refPicList0->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // - EB_U32 cbOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCb; //Jing:double check for 444 - EB_U32 crOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCr; - //EB_U8 verticalIdx; - - mcpContext->localReferenceBlockL0->bufferY = refPicList0->bufferY + lumaOffSet; - mcpContext->localReferenceBlockL0->bufferCb = refPicList0->bufferCb + cbOffset; - mcpContext->localReferenceBlockL0->bufferCr = refPicList0->bufferCr + crOffset; - mcpContext->localReferenceBlockL0->strideY = refPicList0->strideY; - mcpContext->localReferenceBlockL0->strideCb = refPicList0->strideCb; - mcpContext->localReferenceBlockL0->strideCr = refPicList0->strideCr; - } - - // Setup List 1 - if (mvUnit->predDirection == UNI_PRED_LIST_1 || mvUnit->predDirection == BI_PRED) { - - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; - refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; - - // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 - //refList1PosX = (EB_U32) CLIP3((EB_S32)((refPicList1->originX-71) << 2), (EB_S32)((refPicList1->width + refPicList1->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList1->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_1][puIndex]); - refList1PosX = (EB_U32)CLIP3( - (EB_S32)((refPicList1->originX - 71) << 2), - (EB_S32)((refPicList1->width + refPicList1->originX + 7) << 2), - (EB_S32)((puOriginX + refPicList1->originX) << 2) + mvUnit->mv[REF_LIST_1].x); - //refList1PosY = (EB_U32) CLIP3((EB_S32)((refPicList1->originY-71) << 2), (EB_S32)((refPicList1->height + refPicList1->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList1->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_1][puIndex]); - refList1PosY = (EB_U32)CLIP3( - (EB_S32)((refPicList1->originY - 71) << 2), - (EB_S32)((refPicList1->height + refPicList1->originY + 7) << 2), - (EB_S32)((puOriginY + refPicList1->originY) << 2) + mvUnit->mv[REF_LIST_1].y); - - CHECK_REPORT_ERROR( - (refList1PosX < ((refPicList1->width + (refPicList1->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - CHECK_REPORT_ERROR( - (refList1PosY < ((refPicList1->height + (refPicList1->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - //mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; - //mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCb; - //mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCr; - EB_U32 lumaOffSet = ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // - EB_U32 cbOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCb; - EB_U32 crOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCr; - //EB_U8 verticalIdx; - - mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + lumaOffSet; - mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + cbOffset; - mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + crOffset; - - mcpContext->localReferenceBlockL1->strideY = refPicList1->strideY; - mcpContext->localReferenceBlockL1->strideCb = refPicList1->strideCb; - mcpContext->localReferenceBlockL1->strideCr = refPicList1->strideCr; - } + EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; + + // Setup List 0 + if (mvUnit->predDirection == UNI_PRED_LIST_0 || mvUnit->predDirection == BI_PRED) { + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; + refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; + + // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 + //refList0PosX = (EB_U32) CLIP3((EB_S32)((refPicList0->originX-71) << 2), (EB_S32)((refPicList0->width + refPicList0->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList0->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_0][puIndex]); + refList0PosX = (EB_U32)CLIP3( + (EB_S32)((refPicList0->originX - 71) << 2), + (EB_S32)((refPicList0->width + refPicList0->originX + 7) << 2), + (EB_S32)((puOriginX + refPicList0->originX) << 2) + mvUnit->mv[REF_LIST_0].x); + //refList0PosY = (EB_U32) CLIP3((EB_S32)((refPicList0->originY-71) << 2),(EB_S32)((refPicList0->height + refPicList0->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList0->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_0][puIndex]); + refList0PosY = (EB_U32)CLIP3( + (EB_S32)((refPicList0->originY - 71) << 2), + (EB_S32)((refPicList0->height + refPicList0->originY + 7) << 2), + (EB_S32)((puOriginY + refPicList0->originY) << 2) + mvUnit->mv[REF_LIST_0].y); + + + CHECK_REPORT_ERROR( + (refList0PosX < ((refPicList0->width + (refPicList0->originX << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + CHECK_REPORT_ERROR( + (refList0PosY < ((refPicList0->height + (refPicList0->originY << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + EB_U32 lumaOffSet = ((refList0PosX >> 2) - 4) * 2 + ((refList0PosY >> 2) - 4) * 2 * refPicList0->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // + EB_U32 cbOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCb; //Jing:double check for 444 + EB_U32 crOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCr; + //EB_U8 verticalIdx; + + mcpContext->localReferenceBlockL0->bufferY = refPicList0->bufferY + lumaOffSet; + mcpContext->localReferenceBlockL0->bufferCb = refPicList0->bufferCb + cbOffset; + mcpContext->localReferenceBlockL0->bufferCr = refPicList0->bufferCr + crOffset; + mcpContext->localReferenceBlockL0->strideY = refPicList0->strideY; + mcpContext->localReferenceBlockL0->strideCb = refPicList0->strideCb; + mcpContext->localReferenceBlockL0->strideCr = refPicList0->strideCr; + } + + // Setup List 1 + if (mvUnit->predDirection == UNI_PRED_LIST_1 || mvUnit->predDirection == BI_PRED) { + + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; + refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; + + // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 + //refList1PosX = (EB_U32) CLIP3((EB_S32)((refPicList1->originX-71) << 2), (EB_S32)((refPicList1->width + refPicList1->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList1->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_1][puIndex]); + refList1PosX = (EB_U32)CLIP3( + (EB_S32)((refPicList1->originX - 71) << 2), + (EB_S32)((refPicList1->width + refPicList1->originX + 7) << 2), + (EB_S32)((puOriginX + refPicList1->originX) << 2) + mvUnit->mv[REF_LIST_1].x); + //refList1PosY = (EB_U32) CLIP3((EB_S32)((refPicList1->originY-71) << 2), (EB_S32)((refPicList1->height + refPicList1->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList1->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_1][puIndex]); + refList1PosY = (EB_U32)CLIP3( + (EB_S32)((refPicList1->originY - 71) << 2), + (EB_S32)((refPicList1->height + refPicList1->originY + 7) << 2), + (EB_S32)((puOriginY + refPicList1->originY) << 2) + mvUnit->mv[REF_LIST_1].y); + + CHECK_REPORT_ERROR( + (refList1PosX < ((refPicList1->width + (refPicList1->originX << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + CHECK_REPORT_ERROR( + (refList1PosY < ((refPicList1->height + (refPicList1->originY << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + //mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; + //mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCb; + //mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCr; + EB_U32 lumaOffSet = ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // + EB_U32 cbOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCb; + EB_U32 crOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCr; + //EB_U8 verticalIdx; + + mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + lumaOffSet; + mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + cbOffset; + mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + crOffset; + + mcpContext->localReferenceBlockL1->strideY = refPicList1->strideY; + mcpContext->localReferenceBlockL1->strideCb = refPicList1->strideCb; + mcpContext->localReferenceBlockL1->strideCr = refPicList1->strideCr; + } switch(mvUnit->predDirection) { @@ -1103,9 +1103,9 @@ EB_ERRORTYPE EncodePassInterPrediction16bit( break; default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_PRED_ERROR0); + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_PRED_ERROR0); break; } diff --git a/Source/Lib/Codec/EbInterPrediction.h b/Source/Lib/Codec/EbInterPrediction.h index 16167cb0d..2992e2a62 100644 --- a/Source/Lib/Codec/EbInterPrediction.h +++ b/Source/Lib/Codec/EbInterPrediction.h @@ -22,14 +22,14 @@ extern "C" { #define MVBOUNDHIGH 348 // (80+7)<<2 #define REFPADD_QPEL 320 // (16+64)<<2 - void RoundMvOnTheFly( - EB_S16 *motionVector_x, - EB_S16 *motionVector_y); + void RoundMvOnTheFly( + EB_S16 *motionVector_x, + EB_S16 *motionVector_y); struct ModeDecisionContext_s; typedef struct InterPredictionContext_s { - + // mcp context MotionCompensationPredictionContext_t *mcpContext; @@ -40,8 +40,8 @@ typedef struct InterPredictionContext_s { } InterPredictionContext_t; extern EB_ERRORTYPE InterPredictionContextCtor( - InterPredictionContext_t **interPredictionContext, - EB_U16 maxCUWidth, + InterPredictionContext_t **interPredictionContext, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit); @@ -50,10 +50,10 @@ extern EB_ERRORTYPE InterPredictionContextDtor( InterPredictionContext_t *interPredictionContext); extern EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr); EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( struct ModeDecisionContext_s *contextPtr, @@ -65,20 +65,20 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( extern EB_ERRORTYPE EncodePassInterPrediction( MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, MotionCompensationPredictionContext_t *mcpContext); extern EB_ERRORTYPE EncodePassInterPrediction16bit( MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, MotionCompensationPredictionContext_t *mcpContext); @@ -99,4 +99,4 @@ EB_ERRORTYPE ChooseMVPIdx_V2( #ifdef __cplusplus } #endif -#endif //EbInterPrediction_h \ No newline at end of file +#endif //EbInterPrediction_h diff --git a/Source/Lib/Codec/EbIntraPrediction.c b/Source/Lib/Codec/EbIntraPrediction.c index 1816f1dc8..b0a8c1a84 100644 --- a/Source/Lib/Codec/EbIntraPrediction.c +++ b/Source/Lib/Codec/EbIntraPrediction.c @@ -86,7 +86,7 @@ EB_ERRORTYPE IntraReferenceSamplesCtor(IntraReferenceSamples_t **contextDblPtr, EB_MALLOC(EB_U8*, contextPtr->crIntraReferenceArray, sizeof(EB_U8) * (4 * MAX_LCU_SIZE + 1), EB_N_PTR); EB_MALLOC(EB_U8*, contextPtr->yIntraFilteredReferenceArray, sizeof(EB_U8) * (4 * MAX_LCU_SIZE + 1), EB_N_PTR); - + EB_MALLOC(EB_U8*, contextPtr->yIntraReferenceArrayReverse, sizeof(EB_U8) * (4 * MAX_LCU_SIZE + 2), EB_N_PTR); EB_MALLOC(EB_U8*, contextPtr->yIntraFilteredReferenceArrayReverse, sizeof(EB_U8) * (4 * MAX_LCU_SIZE + 2), EB_N_PTR); @@ -127,7 +127,7 @@ EB_ERRORTYPE IntraReference16bitSamplesCtor( IntraReference16bitSamples_t *contextPtr; EB_MALLOC(IntraReference16bitSamples_t*, contextPtr, sizeof(IntraReference16bitSamples_t), EB_N_PTR); *contextDblPtr = contextPtr; - + EB_MALLOC(EB_U16*, contextPtr->yIntraReferenceArray, sizeof(EB_U16) * (4 * MAX_LCU_SIZE + 1), EB_N_PTR); EB_MALLOC(EB_U16*, contextPtr->cbIntraReferenceArray, sizeof(EB_U16) * (4 * MAX_LCU_SIZE + 1), EB_N_PTR); @@ -200,7 +200,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( EB_U8 *yBorderFiltReverse = intraRefPtr->yIntraFilteredReferenceArrayReverse; EB_U8 *cbBorderReverse = intraRefPtr->cbIntraReferenceArrayReverse; EB_U8 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; - + const EB_U32 sizeLog2 = Log2f(size); const EB_U32 puChromaSize = size >> 1; @@ -214,7 +214,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( EB_U8 *sampleWriteLocCr; EB_U32 i; EB_U8 *sampleWriteLocFilt; - + // This internal LCU availability check will be performed for top right and bottom left neighbors only. // It is always set to true for top, left and top left neighbors EB_BOOL bottomLeftAvailabilityPreCalc; @@ -228,11 +228,11 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( const EB_U32 topLeftBlockEnd = 2 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topRightBlockBegin = 3 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topBlockEnd = 4 * (size >> LOG_MIN_PU_SIZE) + 1; - + EB_U32 reconArrayIndex; EB_U32 modeArrayIndex; - + EB_U8 lumaPadValue = 0; EB_U8 cbPadValue = 0; EB_U8 crPadValue = 0; @@ -240,7 +240,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( EB_U8 *lumaWritePtr = yBorder; EB_U8 *cbWritePtr = cbBorder; EB_U8 *crWritePtr = crBorder; - + EB_U32 writeCountLuma; EB_U32 writeCountChroma; @@ -262,7 +262,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( // The Generate Intra Reference sample process is a single pass algorithm // that runs through the neighbor arrays from the bottom left to top right - // and analyzes which samples are available via a spatial availability + // and analyzes which samples are available via a spatial availability // check and various mode checks. Un-available samples at the beginning // of the run (top-right side) are padded with the first valid sample and // all other missing samples are padded with the last valid sample. @@ -270,39 +270,39 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( // * - valid sample // x - missing sample // | - sample used for padding - // <- - padding (copy) operation - // + // <- - padding (copy) operation + // // TOP // 0 - // TOP-LEFT |-------> |---------------> - // * * * * * * * * * x x x x * * * * x x x x x x x x - // * - // * - // * - // * - // ^ x - // | x - // | x - // | x - // - * - // LEFT * - // * - // - * - // | x - // | x - // | x - // v x END - // + // TOP-LEFT |-------> |---------------> + // * * * * * * * * * x x x x * * * * x x x x x x x x + // * + // * + // * + // * + // ^ x + // | x + // | x + // | x + // - * + // LEFT * + // * + // - * + // | x + // | x + // | x + // v x END + // // Skeleton: // 1. Start at position 0 // 2. Loop until first valid position // a. Separate loop for Left, Top-left, and Top neighbor arrays // 3. If no valid samples found, write mid-range value (128 for 8-bit) // 4. Else, write the first valid sample into the invalid range - // 5. Left Loop + // 5. Left Loop // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value - // 6. Top-left Sample (no loop) + // 6. Top-left Sample (no loop) // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value // 7. Top Loop @@ -322,7 +322,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( //************************************************* // Part 1: Initial Invalid Sample Loops //************************************************* - + // Left Block Loop blockIndex = 0; reconArrayIndex = originY + 2 * size - MIN_PU_SIZE; @@ -333,13 +333,13 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -364,14 +364,14 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Set pad value (end of block) lumaPadValue = topLeftLumaReconNeighborArray[reconArrayIndex]; cbPadValue = topLeftCbReconNeighborArray[((MAX_PICTURE_HEIGHT_SIZE- originY)>>subHeightCMinus1) + (originX>>subWidthCMinus1)]; @@ -383,25 +383,25 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( } // Top Block Loop - reconArrayIndex = originX; + reconArrayIndex = originX; while(blockIndex < topBlockEnd && neighborAvailable == EB_FALSE) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Set pad value (beginning of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex]; cbPadValue = topCbReconNeighborArray[reconArrayIndex >> subWidthCMinus1]; @@ -411,7 +411,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + } // Check for no valid border samples @@ -424,18 +424,18 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( EB_MEMSET(lumaWritePtr, MIDRANGE_VALUE_8BIT, writeCountLuma); EB_MEMSET(cbWritePtr, MIDRANGE_VALUE_8BIT, writeCountChroma); EB_MEMSET(crWritePtr, MIDRANGE_VALUE_8BIT, writeCountChroma); - } + } else { - - // Write Pad Value - adjust for the TopLeft block being 1-sample + + // Write Pad Value - adjust for the TopLeft block being 1-sample writeCountLuma = (blockIndex >= topLeftBlockEnd) ? (blockIndex-1) * MIN_PU_SIZE + 1 : blockIndex * MIN_PU_SIZE; - + writeCountChroma = (blockIndex >= topLeftBlockEnd) ? (((blockIndex-1) * MIN_PU_SIZE) >> 1) + 1 : ((blockIndex * MIN_PU_SIZE) >> 1); - + EB_MEMSET(lumaWritePtr, lumaPadValue, writeCountLuma); EB_MEMSET(cbWritePtr, cbPadValue, writeCountChroma); EB_MEMSET(crWritePtr, crPadValue, writeCountChroma); @@ -457,13 +457,13 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -473,12 +473,12 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( lumaWritePtr[1] = leftLumaReconNeighborArray[reconArrayIndex + 2]; lumaWritePtr[2] = leftLumaReconNeighborArray[reconArrayIndex + 1]; lumaWritePtr[3] = leftLumaReconNeighborArray[reconArrayIndex + 0]; - + cbWritePtr[0] = leftCbReconNeighborArray[(reconArrayIndex >> subHeightCMinus1) + 1]; cbWritePtr[1] = leftCbReconNeighborArray[(reconArrayIndex >> subHeightCMinus1) + 0]; crWritePtr[0] = leftCrReconNeighborArray[(reconArrayIndex >> subHeightCMinus1) + 1]; crWritePtr[1] = leftCrReconNeighborArray[(reconArrayIndex >> subHeightCMinus1) + 0]; - + // Set pad value (beginning of block) lumaPadValue = leftLumaReconNeighborArray[reconArrayIndex]; cbPadValue = leftCbReconNeighborArray[reconArrayIndex >> subHeightCMinus1]; @@ -509,14 +509,14 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Copy sample *lumaWritePtr = topLeftLumaReconNeighborArray[reconArrayIndex]; *cbWritePtr = topLeftCbReconNeighborArray[((MAX_PICTURE_HEIGHT_SIZE- originY)>>subHeightCMinus1) + (originX>>subWidthCMinus1)]; @@ -528,7 +528,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( crPadValue = topLeftCrReconNeighborArray[((MAX_PICTURE_HEIGHT_SIZE- originY)>>subHeightCMinus1) + (originX>>subWidthCMinus1)]; } else { - + // Copy pad value *lumaWritePtr = lumaPadValue; *cbWritePtr = cbPadValue; @@ -543,28 +543,28 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( } // Top Block Loop - reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; + reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; while(blockIndex < topBlockEnd) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - - EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); - EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); - EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); + + EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); + EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); // Set pad value (end of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; @@ -572,21 +572,21 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( crPadValue = topCrReconNeighborArray[(reconArrayIndex + MIN_PU_SIZE - 1) >> subWidthCMinus1]; } else { - + // Copy pad value EB_MEMSET(lumaWritePtr, lumaPadValue, MIN_PU_SIZE); EB_MEMSET(cbWritePtr, cbPadValue, MIN_PU_SIZE >> subWidthCMinus1); EB_MEMSET(crWritePtr, crPadValue, MIN_PU_SIZE >> subWidthCMinus1); } - + lumaWritePtr += MIN_PU_SIZE; cbWritePtr += MIN_PU_SIZE >> subWidthCMinus1; crWritePtr += MIN_PU_SIZE >> subWidthCMinus1; - + ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + //************************************************* // Part 3: Strong Intra Filter Samples //************************************************* @@ -650,53 +650,53 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( //************************************************* // Part 4: Create Reversed Reference Samples //************************************************* - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagY = EB_FALSE; intraRefPtr->AboveReadyFlagCb = EB_FALSE; intraRefPtr->AboveReadyFlagCr = EB_FALSE; - + intraRefPtr->LeftReadyFlagY = EB_FALSE; intraRefPtr->LeftReadyFlagCb = EB_FALSE; intraRefPtr->LeftReadyFlagCr = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | =======> L6 | | + L1 | | =======> L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ - + */ + //Luma - EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); - EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; for(i=0; i<(size<<1) ;i++){ - + *sampleWriteLoc = yBorder[i]; *sampleWriteLocFilt = yBorderFilt[i] ; sampleWriteLoc--; sampleWriteLocFilt--; } - //Chroma - EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); - EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + //Chroma + EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); sampleWriteLocCb = cbBorderReverse + (puChromaSize<<1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize<<1) - 1 ; - + for(i=0; i<(puChromaSize<<1) ;i++){ - + *sampleWriteLocCb = cbBorder[i]; *sampleWriteLocCr = crBorder[i]; sampleWriteLocCb--; @@ -733,7 +733,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( EB_U8 *yBorderReverse = intraRefPtr->yIntraReferenceArrayReverse; EB_U8 *yBorderFiltReverse = intraRefPtr->yIntraFilteredReferenceArrayReverse; - + const EB_U32 sizeLog2 = Log2f(size); EB_U32 yLoadCounter; @@ -741,12 +741,12 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( EB_U8 *sampleWriteLoc; EB_U32 i; EB_U8 *sampleWriteLocFilt; - + // This internal LCU availability check will be performed for top right and bottom left neighbors only. // It is always set to true for top, left and top left neighbors EB_BOOL bottomLeftAvailabilityPreCalc; EB_BOOL topRightAvailabilityPreCalc; - + EB_U32 partitionDepth = (size == MIN_PU_SIZE) ? cuDepth + 1 : cuDepth; const EB_U32 cuIndex = ((originY & (lcuSize - 1)) >> sizeLog2) * (1 << partitionDepth) + ((originX & (lcuSize - 1)) >> sizeLog2); @@ -758,15 +758,15 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( const EB_U32 topLeftBlockEnd = 2 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topRightBlockBegin = 3 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topBlockEnd = 4 * (size >> LOG_MIN_PU_SIZE) + 1; - + EB_U32 reconArrayIndex; EB_U32 modeArrayIndex; - + EB_U8 lumaPadValue = 0; EB_U8 *lumaWritePtr = yBorder; - + EB_U32 writeCountLuma; // Neighbor Arrays @@ -784,7 +784,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( // The Generate Intra Reference sample process is a single pass algorithm // that runs through the neighbor arrays from the bottom left to top right - // and analyzes which samples are available via a spatial availability + // and analyzes which samples are available via a spatial availability // check and various mode checks. Un-available samples at the beginning // of the run (top-right side) are padded with the first valid sample and // all other missing samples are padded with the last valid sample. @@ -792,39 +792,39 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( // * - valid sample // x - missing sample // | - sample used for padding - // <- - padding (copy) operation - // + // <- - padding (copy) operation + // // TOP // 0 - // TOP-LEFT |-------> |---------------> - // * * * * * * * * * x x x x * * * * x x x x x x x x - // * - // * - // * - // * - // ^ x - // | x - // | x - // | x - // - * - // LEFT * - // * - // - * - // | x - // | x - // | x - // v x END - // + // TOP-LEFT |-------> |---------------> + // * * * * * * * * * x x x x * * * * x x x x x x x x + // * + // * + // * + // * + // ^ x + // | x + // | x + // | x + // - * + // LEFT * + // * + // - * + // | x + // | x + // | x + // v x END + // // Skeleton: // 1. Start at position 0 // 2. Loop until first valid position // a. Separate loop for Left, Top-left, and Top neighbor arrays // 3. If no valid samples found, write mid-range value (128 for 8-bit) // 4. Else, write the first valid sample into the invalid range - // 5. Left Loop + // 5. Left Loop // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value - // 6. Top-left Sample (no loop) + // 6. Top-left Sample (no loop) // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value // 7. Top Loop @@ -844,7 +844,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( //************************************************* // Part 1: Initial Invalid Sample Loops //************************************************* - + // Left Block Loop blockIndex = 0; reconArrayIndex = originY + 2 * size - MIN_PU_SIZE; @@ -854,13 +854,13 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -884,14 +884,14 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Set pad value (end of block) lumaPadValue = topLeftLumaReconNeighborArray[reconArrayIndex]; @@ -904,23 +904,23 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( // Top Block Loop reconArrayIndex = originX; while(blockIndex < topBlockEnd && neighborAvailable == EB_FALSE) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Set pad value (beginning of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex]; } @@ -928,7 +928,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + } // Check for no valid border samples @@ -938,14 +938,14 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( // Write Midrange EB_MEMSET(lumaWritePtr, MIDRANGE_VALUE_8BIT, writeCountLuma); - } + } else { - - // Write Pad Value - adjust for the TopLeft block being 1-sample + + // Write Pad Value - adjust for the TopLeft block being 1-sample writeCountLuma = (blockIndex >= topLeftBlockEnd) ? (blockIndex-1) * MIN_PU_SIZE + 1 : blockIndex * MIN_PU_SIZE; - + EB_MEMSET(lumaWritePtr, lumaPadValue, writeCountLuma); } @@ -963,13 +963,13 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -979,7 +979,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( lumaWritePtr[1] = leftLumaReconNeighborArray[reconArrayIndex + 2]; lumaWritePtr[2] = leftLumaReconNeighborArray[reconArrayIndex + 1]; lumaWritePtr[3] = leftLumaReconNeighborArray[reconArrayIndex + 0]; - + // Set pad value (beginning of block) lumaPadValue = leftLumaReconNeighborArray[reconArrayIndex]; } @@ -1004,14 +1004,14 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Copy sample *lumaWritePtr = topLeftLumaReconNeighborArray[reconArrayIndex]; @@ -1019,7 +1019,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( lumaPadValue = topLeftLumaReconNeighborArray[reconArrayIndex]; } else { - + // Copy pad value *lumaWritePtr = lumaPadValue; } @@ -1033,42 +1033,42 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( reconArrayIndex = originX + (blockIndex - topLeftBlockEnd)*MIN_PU_SIZE; while(blockIndex < topBlockEnd) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Copy samples in reverse order - EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; - + } else { - + // Copy pad value EB_MEMSET(lumaWritePtr, lumaPadValue, MIN_PU_SIZE); } - + lumaWritePtr += MIN_PU_SIZE; - + ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + //************************************************* // Part 3: Strong Intra Filter Samples //************************************************* @@ -1131,32 +1131,32 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( //************************************************* // Part 4: Create Reversed Reference Samples //************************************************* - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagY = EB_FALSE; intraRefPtr->LeftReadyFlagY = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | =======> L6 | | + L1 | | =======> L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); - EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; for(i=0; i<(size<<1) ;i++){ - + *sampleWriteLoc = yBorder[i]; *sampleWriteLocFilt = yBorderFilt[i] ; sampleWriteLoc--; @@ -1200,7 +1200,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( EB_U8 *cbBorderFiltReverse = intraRefPtr->cbIntraFilteredReferenceArrayReverse; EB_U8 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; EB_U8 *crBorderFiltReverse = intraRefPtr->crIntraFilteredReferenceArrayReverse; - + const EB_U32 sizeLog2 = Log2f(size); const EB_U32 puChromaSize = size >> ((colorFormat==EB_YUV420 || colorFormat==EB_YUV422) ? 1 : 0); const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -1215,7 +1215,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( EB_U8 *sampleWriteLocCr; EB_U8 *sampleWriteLocCbFilt; EB_U8 *sampleWriteLocCrFilt; - + // This internal LCU availability check will be performed for top right and bottom left neighbors only. // It is always set to true for top, left and top left neighbors EB_BOOL bottomLeftAvailabilityPreCalc; @@ -1232,7 +1232,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( EB_U32 topLeftBlockEnd = 2 * (puChromaSize >> LOG_MIN_PU_SIZE) + 1; EB_U32 topRightBlockBegin = 3 * (puChromaSize >> LOG_MIN_PU_SIZE) + 1; EB_U32 topBlockEnd = 4 * (puChromaSize >> LOG_MIN_PU_SIZE) + 1; - + EB_U32 reconArrayIndex; EB_U32 modeArrayIndex; @@ -1263,7 +1263,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( // The Generate Intra Reference sample process is a single pass algorithm // that runs through the neighbor arrays from the bottom left to top right - // and analyzes which samples are available via a spatial availability + // and analyzes which samples are available via a spatial availability // check and various mode checks. Un-available samples at the beginning // of the run (top-right side) are padded with the first valid sample and // all other missing samples are padded with the last valid sample. @@ -1271,39 +1271,39 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( // * - valid sample // x - missing sample // | - sample used for padding - // <- - padding (copy) operation - // + // <- - padding (copy) operation + // // TOP // 0 - // TOP-LEFT |-------> |---------------> - // * * * * * * * * * x x x x * * * * x x x x x x x x - // * - // * - // * - // * - // ^ x - // | x - // | x - // | x - // - * - // LEFT * - // * - // - * - // | x - // | x - // | x - // v x END - // + // TOP-LEFT |-------> |---------------> + // * * * * * * * * * x x x x * * * * x x x x x x x x + // * + // * + // * + // * + // ^ x + // | x + // | x + // | x + // - * + // LEFT * + // * + // - * + // | x + // | x + // | x + // v x END + // // Skeleton: // 1. Start at position 0 // 2. Loop until first valid position // a. Separate loop for Left, Top-left, and Top neighbor arrays // 3. If no valid samples found, write mid-range value (128 for 8-bit) // 4. Else, write the first valid sample into the invalid range - // 5. Left Loop + // 5. Left Loop // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value - // 6. Top-left Sample (no loop) + // 6. Top-left Sample (no loop) // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value // 7. Top Loop @@ -1332,7 +1332,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( //************************************************* // Part 1: Initial Invalid Sample Loops //************************************************* - + // Left Block Loop blockIndex = 0; @@ -1347,13 +1347,13 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex << subHeightCMinus1); //mode is stored as luma, so convert to luma axis - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -1375,10 +1375,10 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( cuOriginX, cuOriginY + chromaOffset); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -1398,8 +1398,8 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex << subWidthCMinus1); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check @@ -1410,7 +1410,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Set pad value (beginning of block) cbPadValue = topCbReconNeighborArray[reconArrayIndex]; crPadValue = topCrReconNeighborArray[reconArrayIndex]; @@ -1419,7 +1419,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + } // Check for no valid border samples @@ -1429,9 +1429,9 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( // Write Midrange EB_MEMSET(cbWritePtr, MIDRANGE_VALUE_8BIT, writeCountChroma); EB_MEMSET(crWritePtr, MIDRANGE_VALUE_8BIT, writeCountChroma); - } + } else { - // Write Pad Value - adjust for the TopLeft block being 1-sample + // Write Pad Value - adjust for the TopLeft block being 1-sample writeCountChroma = (blockIndex >= topLeftBlockEnd) ? ((blockIndex-1) * MIN_PU_SIZE) + 1 : (blockIndex * MIN_PU_SIZE); @@ -1456,18 +1456,18 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex << subHeightCMinus1); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - // Copy samples (Reverse the order) + // Copy samples (Reverse the order) cbWritePtr[0] = leftCbReconNeighborArray[(reconArrayIndex) + 3]; cbWritePtr[1] = leftCbReconNeighborArray[(reconArrayIndex) + 2]; cbWritePtr[2] = leftCbReconNeighborArray[(reconArrayIndex) + 1]; @@ -1501,10 +1501,10 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( cuOriginX, cuOriginY+chromaOffset); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -1533,8 +1533,8 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex << subWidthCMinus1); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check @@ -1545,9 +1545,9 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - - EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); - EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + + EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) cbPadValue = topCbReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; @@ -1593,7 +1593,7 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( //************************************************* // Part 3: Create Reversed Reference Samples //************************************************* - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagCb = EB_FALSE; intraRefPtr->AboveReadyFlagCr = EB_FALSE; @@ -1601,26 +1601,26 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( intraRefPtr->LeftReadyFlagCb = EB_FALSE; intraRefPtr->LeftReadyFlagCr = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | =======> L6 | | + L1 | | =======> L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); - EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); sampleWriteLocCb = cbBorderReverse + (puChromaSize << 1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize << 1) - 1 ; - + for(i = 0; i < (puChromaSize << 1) ;i++){ *sampleWriteLocCb = cbBorder[i]; *sampleWriteLocCr = crBorder[i]; @@ -1676,7 +1676,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( EB_U16 *yBorderFiltReverse = intraRefPtr->yIntraFilteredReferenceArrayReverse; EB_U16 *cbBorderReverse = intraRefPtr->cbIntraReferenceArrayReverse; EB_U16 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; - + const EB_U32 sizeLog2 = Log2f(size); const EB_U32 chromaRatio = (colorFormat==EB_YUV420 || colorFormat==EB_YUV422)?1:0; const EB_U32 puChromaSize = size >> chromaRatio; @@ -1688,7 +1688,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( EB_U16 *sampleWriteLocCr; EB_U32 i; EB_U16 *sampleWriteLocFilt; - + // This internal LCU availability check will be performed for top right and bottom left neighbors only. // It is always set to true for top, left and top left neighbors EB_BOOL bottomLeftAvailabilityPreCalc; @@ -1703,11 +1703,11 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( const EB_U32 topLeftBlockEnd = 2 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topRightBlockBegin = 3 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topBlockEnd = 4 * (size >> LOG_MIN_PU_SIZE) + 1; - + EB_U32 reconArrayIndex; EB_U32 modeArrayIndex; - + EB_U16 lumaPadValue = 0; EB_U16 cbPadValue = 0; EB_U16 crPadValue = 0; @@ -1715,7 +1715,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( EB_U16 *lumaWritePtr = yBorder; EB_U16 *cbWritePtr = cbBorder; EB_U16 *crWritePtr = crBorder; - + EB_U32 writeCountLuma; EB_U32 writeCountChroma; @@ -1725,7 +1725,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( EB_U32 leftModeNeighborArraySize = modeTypeNeighborArray->leftArraySize; EB_U8 *leftModeNeighborArray = modeTypeNeighborArray->leftArray; EB_U8 *topLeftModeNeighborArray = modeTypeNeighborArray->topLeftArray; - + EB_U16 *topLumaReconNeighborArray = (EB_U16*)lumaReconNeighborArray->topArray; EB_U16 *leftLumaReconNeighborArray = (EB_U16*)lumaReconNeighborArray->leftArray; EB_U16 *topLeftLumaReconNeighborArray = (EB_U16*)lumaReconNeighborArray->topLeftArray; @@ -1738,7 +1738,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( // The Generate Intra Reference sample process is a single pass algorithm // that runs through the neighbor arrays from the bottom left to top right - // and analyzes which samples are available via a spatial availability + // and analyzes which samples are available via a spatial availability // check and various mode checks. Un-available samples at the beginning // of the run (top-right side) are padded with the first valid sample and // all other missing samples are padded with the last valid sample. @@ -1746,39 +1746,39 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( // * - valid sample // x - missing sample // | - sample used for padding - // <- - padding (copy) operation - // + // <- - padding (copy) operation + // // TOP // 0 - // TOP-LEFT |-------> |---------------> - // * * * * * * * * * x x x x * * * * x x x x x x x x - // * - // * - // * - // * - // ^ x - // | x - // | x - // | x - // - * - // LEFT * - // * - // - * - // | x - // | x - // | x - // v x END - // + // TOP-LEFT |-------> |---------------> + // * * * * * * * * * x x x x * * * * x x x x x x x x + // * + // * + // * + // * + // ^ x + // | x + // | x + // | x + // - * + // LEFT * + // * + // - * + // | x + // | x + // | x + // v x END + // // Skeleton: // 1. Start at position 0 // 2. Loop until first valid position // a. Separate loop for Left, Top-left, and Top neighbor arrays // 3. If no valid samples found, write mid-range value (128 for 8-bit) // 4. Else, write the first valid sample into the invalid range - // 5. Left Loop + // 5. Left Loop // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value - // 6. Top-left Sample (no loop) + // 6. Top-left Sample (no loop) // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value // 7. Top Loop @@ -1798,7 +1798,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( //************************************************* // Part 1: Initial Invalid Sample Loops //************************************************* - + // Left Block Loop blockIndex = 0; reconArrayIndex = originY + 2 * size - MIN_PU_SIZE; @@ -1809,13 +1809,13 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -1841,14 +1841,14 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Set pad value (end of block) lumaPadValue = topLeftLumaReconNeighborArray[reconArrayIndex]; cbPadValue = topLeftCbReconNeighborArray[reconArrayIndex >> chromaRatio]; @@ -1862,23 +1862,23 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( // Top Block Loop reconArrayIndex = originX; while(blockIndex < topBlockEnd && neighborAvailable == EB_FALSE) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Set pad value (beginning of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex]; cbPadValue = topCbReconNeighborArray[reconArrayIndex >> chromaRatio]; @@ -1888,7 +1888,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + } // Check for no valid border samples @@ -1897,22 +1897,22 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( writeCountLuma = 4*size + 1; writeCountChroma = 4*(size>>chromaRatio) + 1; - // Write Midrange + // Write Midrange memset16bit(lumaWritePtr, MIDRANGE_VALUE_10BIT, writeCountLuma); memset16bit(cbWritePtr, MIDRANGE_VALUE_10BIT, writeCountChroma); memset16bit(crWritePtr, MIDRANGE_VALUE_10BIT, writeCountChroma); - } + } else { - - // Write Pad Value - adjust for the TopLeft block being 1-sample + + // Write Pad Value - adjust for the TopLeft block being 1-sample writeCountLuma = (blockIndex >= topLeftBlockEnd) ? (blockIndex-1) * MIN_PU_SIZE + 1 : blockIndex * MIN_PU_SIZE; - + writeCountChroma = (blockIndex >= topLeftBlockEnd) ? (((blockIndex-1) * MIN_PU_SIZE) >> chromaRatio) + 1 : ((blockIndex * MIN_PU_SIZE) >> chromaRatio); - + memset16bit(lumaWritePtr, lumaPadValue, writeCountLuma); memset16bit(cbWritePtr, cbPadValue, writeCountChroma); memset16bit(crWritePtr, crPadValue, writeCountChroma); @@ -1934,13 +1934,13 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -1950,13 +1950,13 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( lumaWritePtr[1] = leftLumaReconNeighborArray[reconArrayIndex + 2]; lumaWritePtr[2] = leftLumaReconNeighborArray[reconArrayIndex + 1]; lumaWritePtr[3] = leftLumaReconNeighborArray[reconArrayIndex + 0]; - + cbWritePtr[0] = leftCbReconNeighborArray[(reconArrayIndex >> chromaRatio) + 1]; cbWritePtr[1] = leftCbReconNeighborArray[(reconArrayIndex >> chromaRatio) + 0]; - + crWritePtr[0] = leftCrReconNeighborArray[(reconArrayIndex >> chromaRatio) + 1]; crWritePtr[1] = leftCrReconNeighborArray[(reconArrayIndex >> chromaRatio) + 0]; - + // Set pad value (beginning of block) lumaPadValue = leftLumaReconNeighborArray[reconArrayIndex]; cbPadValue = leftCbReconNeighborArray[reconArrayIndex >> chromaRatio]; @@ -1987,14 +1987,14 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Copy sample *lumaWritePtr = topLeftLumaReconNeighborArray[reconArrayIndex]; *cbWritePtr = topLeftCbReconNeighborArray[reconArrayIndex >> chromaRatio]; @@ -2006,7 +2006,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( crPadValue = topLeftCrReconNeighborArray[reconArrayIndex >> chromaRatio]; } else { - + // Copy pad value *lumaWritePtr = lumaPadValue; *cbWritePtr = cbPadValue; @@ -2021,25 +2021,25 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( } // Top Block Loop - reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; + reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; while(blockIndex < topBlockEnd) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Copy samples in reverse order memcpy16bit(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); memcpy16bit(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex >> chromaRatio], MIN_PU_SIZE >> chromaRatio); @@ -2051,21 +2051,21 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( crPadValue = topCrReconNeighborArray[(reconArrayIndex + MIN_PU_SIZE - 1) >> chromaRatio]; } else { - + // Copy pad value memset16bit(lumaWritePtr, lumaPadValue, MIN_PU_SIZE); memset16bit(cbWritePtr, cbPadValue, MIN_PU_SIZE >> chromaRatio); memset16bit(crWritePtr, crPadValue, MIN_PU_SIZE >> chromaRatio); } - + lumaWritePtr += MIN_PU_SIZE; cbWritePtr += MIN_PU_SIZE >> chromaRatio; crWritePtr += MIN_PU_SIZE >> chromaRatio; - + ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + //************************************************* // Part 3: Strong Intra Filter Samples //************************************************* @@ -2128,30 +2128,30 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( //************************************************* // Part 4: Create Reversed Reference Samples //************************************************* - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagY = EB_FALSE; intraRefPtr->AboveReadyFlagCb = EB_FALSE; intraRefPtr->AboveReadyFlagCr = EB_FALSE; - + intraRefPtr->LeftReadyFlagY = EB_FALSE; intraRefPtr->LeftReadyFlagCb = EB_FALSE; intraRefPtr->LeftReadyFlagCr = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | =======> L6 | | + L1 | | =======> L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ - + */ + //Luma memcpy16bit(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); memcpy16bit(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); @@ -2159,22 +2159,22 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; for(i=0; i<(size<<1) ;i++){ - + *sampleWriteLoc = yBorder[i]; *sampleWriteLocFilt = yBorderFilt[i] ; sampleWriteLoc--; sampleWriteLocFilt--; } - //Chroma + //Chroma memcpy16bit(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); memcpy16bit(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); sampleWriteLocCb = cbBorderReverse + (puChromaSize<<1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize<<1) - 1 ; - + for(i=0; i<(puChromaSize<<1) ;i++){ - + *sampleWriteLocCb = cbBorder[i]; *sampleWriteLocCr = crBorder[i]; sampleWriteLocCb--; @@ -2224,7 +2224,7 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( // It is always set to true for top, left and top left neighbors EB_BOOL bottomLeftAvailabilityPreCalc; EB_BOOL topRightAvailabilityPreCalc; - + EB_U32 partitionDepth = (size == MIN_PU_SIZE) ? cuDepth + 1 : cuDepth; const EB_U32 cuIndex = ((originY & (lcuSize - 1)) >> sizeLog2) * (1 << partitionDepth) + ((originX & (lcuSize - 1)) >> sizeLog2); @@ -2236,14 +2236,14 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( const EB_U32 topLeftBlockEnd = 2 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topRightBlockBegin = 3 * (size >> LOG_MIN_PU_SIZE) + 1; const EB_U32 topBlockEnd = 4 * (size >> LOG_MIN_PU_SIZE) + 1; - + EB_U32 reconArrayIndex; EB_U32 modeArrayIndex; - + EB_U16 lumaPadValue = 0; EB_U16 *lumaWritePtr = yBorder; - + EB_U32 writeCountLuma; // Neighbor Arrays @@ -2261,7 +2261,7 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( // The Generate Intra Reference sample process is a single pass algorithm // that runs through the neighbor arrays from the bottom left to top right - // and analyzes which samples are available via a spatial availability + // and analyzes which samples are available via a spatial availability // check and various mode checks. Un-available samples at the beginning // of the run (top-right side) are padded with the first valid sample and // all other missing samples are padded with the last valid sample. @@ -2269,39 +2269,39 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( // * - valid sample // x - missing sample // | - sample used for padding - // <- - padding (copy) operation - // + // <- - padding (copy) operation + // // TOP // 0 - // TOP-LEFT |-------> |---------------> - // * * * * * * * * * x x x x * * * * x x x x x x x x - // * - // * - // * - // * - // ^ x - // | x - // | x - // | x - // - * - // LEFT * - // * - // - * - // | x - // | x - // | x - // v x END - // + // TOP-LEFT |-------> |---------------> + // * * * * * * * * * x x x x * * * * x x x x x x x x + // * + // * + // * + // * + // ^ x + // | x + // | x + // | x + // - * + // LEFT * + // * + // - * + // | x + // | x + // | x + // v x END + // // Skeleton: // 1. Start at position 0 // 2. Loop until first valid position // a. Separate loop for Left, Top-left, and Top neighbor arrays // 3. If no valid samples found, write mid-range value (128 for 8-bit) // 4. Else, write the first valid sample into the invalid range - // 5. Left Loop + // 5. Left Loop // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value - // 6. Top-left Sample (no loop) + // 6. Top-left Sample (no loop) // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value // 7. Top Loop @@ -2321,7 +2321,7 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( //************************************************* // Part 1: Initial Invalid Sample Loops //************************************************* - + // Left Block Loop blockIndex = 0; reconArrayIndex = originY + 2 * size - MIN_PU_SIZE; @@ -2332,13 +2332,13 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -2362,14 +2362,14 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Set pad value (end of block) lumaPadValue = topLeftLumaReconNeighborArray[reconArrayIndex]; @@ -2382,23 +2382,23 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( // Top Block Loop reconArrayIndex = originX; while(blockIndex < topBlockEnd && neighborAvailable == EB_FALSE) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Set pad value (beginning of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex]; } @@ -2406,7 +2406,7 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + } // Check for no valid border samples @@ -2416,14 +2416,14 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( // Write Midrange memset16bit(lumaWritePtr, MIDRANGE_VALUE_10BIT, writeCountLuma); - } + } else { - - // Write Pad Value - adjust for the TopLeft block being 1-sample + + // Write Pad Value - adjust for the TopLeft block being 1-sample writeCountLuma = (blockIndex >= topLeftBlockEnd) ? (blockIndex-1) * MIN_PU_SIZE + 1 : blockIndex * MIN_PU_SIZE; - + memset16bit(lumaWritePtr, lumaPadValue, writeCountLuma); } @@ -2441,13 +2441,13 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -2457,7 +2457,7 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( lumaWritePtr[1] = leftLumaReconNeighborArray[reconArrayIndex + 2]; lumaWritePtr[2] = leftLumaReconNeighborArray[reconArrayIndex + 1]; lumaWritePtr[3] = leftLumaReconNeighborArray[reconArrayIndex + 0]; - + // Set pad value (beginning of block) lumaPadValue = leftLumaReconNeighborArray[reconArrayIndex]; } @@ -2482,14 +2482,14 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( originX, originY); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Copy sample *lumaWritePtr = topLeftLumaReconNeighborArray[reconArrayIndex]; @@ -2497,7 +2497,7 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( lumaPadValue = topLeftLumaReconNeighborArray[reconArrayIndex]; } else { - + // Copy pad value *lumaWritePtr = lumaPadValue; } @@ -2511,41 +2511,41 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( reconArrayIndex = originX + (blockIndex - topLeftBlockEnd)*MIN_PU_SIZE; while(blockIndex < topBlockEnd) { - + modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex); - - neighborAvailable = + + neighborAvailable = (modeArrayIndex >= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check (topModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureTopBoundary == EB_TRUE) ? EB_FALSE : // top picture boundary check (pictureRightBoundary == EB_TRUE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // right picture boundary check - (topModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check - + if(neighborAvailable == EB_TRUE) { - + // Copy samples in reverse order memcpy16bit(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; - + } else { // Copy pad value memset16bit(lumaWritePtr, lumaPadValue, MIN_PU_SIZE); } - + lumaWritePtr += MIN_PU_SIZE; - + ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + //************************************************* // Part 3: Strong Intra Filter Samples //************************************************* @@ -2609,27 +2609,27 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( //************************************************* // Part 4: Create Reversed Reference Samples //************************************************* - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagY = EB_FALSE; intraRefPtr->LeftReadyFlagY = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | =======> L6 | | + L1 | | =======> L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - memcpy16bit(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); - memcpy16bit(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); + memcpy16bit(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); + memcpy16bit(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; @@ -2679,7 +2679,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( EB_U16 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; EB_U16 *crBorderFiltReverse = intraRefPtr->crIntraFilteredReferenceArrayReverse; - + const EB_U32 sizeLog2 = Log2f(size); const EB_U32 puChromaSize = size >> ((colorFormat == EB_YUV420 || colorFormat == EB_YUV422) ? 1 : 0); const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -2694,7 +2694,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( EB_U16 *sampleWriteLocCr; EB_U16 *sampleWriteLocCbFilt; EB_U16 *sampleWriteLocCrFilt; - + // This internal LCU availability check will be performed for top right and bottom left neighbors only. // It is always set to true for top, left and top left neighbors EB_BOOL bottomLeftAvailabilityPreCalc; @@ -2711,7 +2711,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( EB_U32 topLeftBlockEnd = 2 * (puChromaSize >> LOG_MIN_PU_SIZE) + 1; EB_U32 topRightBlockBegin = 3 * (puChromaSize >> LOG_MIN_PU_SIZE) + 1; EB_U32 topBlockEnd = 4 * (puChromaSize >> LOG_MIN_PU_SIZE) + 1; - + EB_U32 reconArrayIndex; EB_U32 modeArrayIndex; @@ -2742,7 +2742,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( // The Generate Intra Reference sample process is a single pass algorithm // that runs through the neighbor arrays from the bottom left to top right - // and analyzes which samples are available via a spatial availability + // and analyzes which samples are available via a spatial availability // check and various mode checks. Un-available samples at the beginning // of the run (top-right side) are padded with the first valid sample and // all other missing samples are padded with the last valid sample. @@ -2750,39 +2750,39 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( // * - valid sample // x - missing sample // | - sample used for padding - // <- - padding (copy) operation - // + // <- - padding (copy) operation + // // TOP // 0 - // TOP-LEFT |-------> |---------------> - // * * * * * * * * * x x x x * * * * x x x x x x x x - // * - // * - // * - // * - // ^ x - // | x - // | x - // | x - // - * - // LEFT * - // * - // - * - // | x - // | x - // | x - // v x END - // + // TOP-LEFT |-------> |---------------> + // * * * * * * * * * x x x x * * * * x x x x x x x x + // * + // * + // * + // * + // ^ x + // | x + // | x + // | x + // - * + // LEFT * + // * + // - * + // | x + // | x + // | x + // v x END + // // Skeleton: // 1. Start at position 0 // 2. Loop until first valid position // a. Separate loop for Left, Top-left, and Top neighbor arrays // 3. If no valid samples found, write mid-range value (128 for 8-bit) // 4. Else, write the first valid sample into the invalid range - // 5. Left Loop + // 5. Left Loop // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value - // 6. Top-left Sample (no loop) + // 6. Top-left Sample (no loop) // a. If block is valid, copy recon values & update pad value // b. Else, copy pad value // 7. Top Loop @@ -2811,7 +2811,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( //************************************************* // Part 1: Initial Invalid Sample Loops //************************************************* - + // Left Block Loop blockIndex = 0; @@ -2827,13 +2827,13 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex<= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -2855,10 +2855,10 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( cuOriginX, cuOriginY + chromaOffset); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -2877,8 +2877,8 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex<= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check @@ -2889,17 +2889,17 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - + // Set pad value (beginning of block) cbPadValue = topCbReconNeighborArray[reconArrayIndex]; crPadValue = topCrReconNeighborArray[reconArrayIndex]; - + } else { ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } - + } // Check for no valid border samples @@ -2910,10 +2910,10 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( // Write Midrange memset16bit(cbWritePtr, MIDRANGE_VALUE_10BIT, writeCountChroma); memset16bit(crWritePtr, MIDRANGE_VALUE_10BIT, writeCountChroma); - } + } else { - - // Write Pad Value - adjust for the TopLeft block being 1-sample + + // Write Pad Value - adjust for the TopLeft block being 1-sample writeCountChroma = (blockIndex >= topLeftBlockEnd) ? ((blockIndex-1) * MIN_PU_SIZE) + 1 : (blockIndex * MIN_PU_SIZE); @@ -2938,17 +2938,17 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( modeTypeNeighborArray, reconArrayIndex << subHeightCMinus1); - neighborAvailable = + neighborAvailable = (modeArrayIndex >= leftModeNeighborArraySize) ? EB_FALSE : // array boundary check (bottomLeftAvailabilityPreCalc == EB_FALSE && blockIndex < bottomLeftEnd) ? EB_FALSE : // internal scan-order check (leftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (leftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - // Copy samples (Reverse the order) + // Copy samples (Reverse the order) cbWritePtr[0] = leftCbReconNeighborArray[(reconArrayIndex) + 3]; cbWritePtr[1] = leftCbReconNeighborArray[(reconArrayIndex) + 2]; cbWritePtr[2] = leftCbReconNeighborArray[(reconArrayIndex) + 1]; @@ -2983,10 +2983,10 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( cuOriginX, cuOriginY + chromaOffset); - neighborAvailable = + neighborAvailable = (topLeftModeNeighborArray[modeArrayIndex] == (EB_U8) INVALID_MODE) ? EB_FALSE : // slice boundary check (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : // left picture boundary check - (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && + (topLeftModeNeighborArray[modeArrayIndex] == INTER_MODE && constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { @@ -3017,8 +3017,8 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( modeArrayIndex = GetNeighborArrayUnitTopIndex( modeTypeNeighborArray, reconArrayIndex<= topModeNeighborArraySize) ? EB_FALSE : // array boundary check (topRightAvailabilityPreCalc == EB_FALSE && blockIndex >= topRightBlockBegin) ? EB_FALSE : // internal scan-order check @@ -3029,16 +3029,16 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( constrainedIntraFlag == EB_TRUE) ? EB_FALSE : EB_TRUE; // contrained intra check if(neighborAvailable == EB_TRUE) { - - memcpy16bit(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); - memcpy16bit(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + + memcpy16bit(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + memcpy16bit(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) cbPadValue = topCbReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; crPadValue = topCrReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; } else { - + // Copy pad value memset16bit(cbWritePtr, cbPadValue, MIN_PU_SIZE); memset16bit(crWritePtr, crPadValue, MIN_PU_SIZE); @@ -3046,7 +3046,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( cbWritePtr += MIN_PU_SIZE; crWritePtr += MIN_PU_SIZE; - + ++blockIndex; reconArrayIndex += MIN_PU_SIZE; } @@ -3082,7 +3082,7 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( //************************************************* // Part 3: Create Reversed Reference Samples //************************************************* - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagCb = EB_FALSE; intraRefPtr->AboveReadyFlagCr = EB_FALSE; @@ -3090,26 +3090,26 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( intraRefPtr->LeftReadyFlagCb = EB_FALSE; intraRefPtr->LeftReadyFlagCr = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | =======> L6 | | + L1 | | =======> L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - memcpy16bit(cbBorderReverse + (puChromaSize << 1), cbBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); - memcpy16bit(crBorderReverse + (puChromaSize << 1), crBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); + memcpy16bit(cbBorderReverse + (puChromaSize << 1), cbBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); + memcpy16bit(crBorderReverse + (puChromaSize << 1), crBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); sampleWriteLocCb = cbBorderReverse + (puChromaSize<<1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize<<1) - 1 ; - + for(i=0; i<(puChromaSize<<1); i++){ *sampleWriteLocCb = cbBorder[i]; *sampleWriteLocCr = crBorder[i]; @@ -3150,10 +3150,10 @@ static void IntraModeAngular_27To33( EB_S32 intraPredAngle = intraModeAngularTable[mode - INTRA_VERTICAL_MODE]; refSampMain = refSamples + (size << 1); - IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - size, + IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3170,11 +3170,11 @@ static void IntraModeAngular16bit_27To33( EB_U16 *refSampMain; EB_S32 intraPredAngle = intraModeAngularTable[mode - INTRA_VERTICAL_MODE]; refSampMain = refSamples + (size << 1); - + IntraAngVertical_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - size, + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3193,7 +3193,7 @@ static void IntraModeAngular_19To25( const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr EB_U8 *refAbove, EB_BOOL *AboveReadyFlag - ) + ) { EB_U8 *refSampMain; EB_U8 *refSampSide; @@ -3205,12 +3205,12 @@ static void IntraModeAngular_19To25( EB_U32 invAngleSum = 128; // rounding used for (shift by 8) EB_S32 idx; EB_U32 index; - - if (INTRA_VERTICAL_MODE - mode < 9 ) { // check for index range, has to be less than size of array - intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; - invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; - } - + + if (INTRA_VERTICAL_MODE - mode < 9 ) { // check for index range, has to be less than size of array + intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; + invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; + } + //We just need to copy above Reference pixels only for ONE TIME for all modes of this group //where Filtered or non-Filtered are always used (8x8,32x32) if( (*AboveReadyFlag == EB_FALSE) || (size==16) ){ @@ -3220,8 +3220,8 @@ static void IntraModeAngular_19To25( for(index = 0; index < numberOfSamples; index++) { refAbove[index+size-1] = refSamples[refOffset + index]; } - } - + } + refSampMain = refAbove + (size - 1); // Extend the Main reference to the left for angles with negative slope @@ -3232,11 +3232,11 @@ static void IntraModeAngular_19To25( refSampMain[signIndex] = refSampSide[idx]; } - - IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - size, + + IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3254,7 +3254,7 @@ static void IntraModeAngular16bit_19To25( const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr EB_U16 *refAbove, EB_BOOL *AboveReadyFlag - ) + ) { EB_U16 *refSampMain; EB_U16 *refSampSide; @@ -3266,12 +3266,12 @@ static void IntraModeAngular16bit_19To25( EB_U32 invAngleSum = 128; // rounding used for (shift by 8) EB_S32 idx; EB_U32 index; - + if (INTRA_VERTICAL_MODE - mode < 9) { // check for index range, has to be less than size of array - intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; - invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; - } - + intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; + invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; + } + //We just need to copy above Reference pixels only for ONE TIME for all modes of this group //where Filtered or non-Filtered are always used (8x8,32x32) if( (*AboveReadyFlag == EB_FALSE) || (size==16) ){ @@ -3281,8 +3281,8 @@ static void IntraModeAngular16bit_19To25( for(index = 0; index < numberOfSamples; index++) { refAbove[index+size-1] = refSamples[refOffset + index]; } - } - + } + refSampMain = refAbove + (size - 1); // Extend the Main reference to the left for angles with negative slope @@ -3293,11 +3293,11 @@ static void IntraModeAngular16bit_19To25( refSampMain[signIndex] = refSampSide[idx]; } - - IntraAngVertical_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - size, + + IntraAngVertical_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3316,7 +3316,7 @@ static void IntraModeAngular_11To17( EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr EB_U8 *refLeft, - EB_BOOL *LeftReadyFlag) + EB_BOOL *LeftReadyFlag) { EB_U8 *refSampMain; EB_U8 *refSampSide; @@ -3324,7 +3324,7 @@ static void IntraModeAngular_11To17( EB_S32 signIndex; const EB_U32 refOffset = (size << 1); EB_U32 index; - + EB_S32 intraPredAngle = intraModeAngularTableNegative[ mode - INTRA_HORIZONTAL_MODE]; EB_U32 invAngle = invIntraModeAngularTable[mode - INTRA_HORIZONTAL_MODE]; EB_U32 invAngleSum = 128; // rounding used for (shift by 8) @@ -3337,24 +3337,24 @@ static void IntraModeAngular_11To17( // Copy left reference samples (inc top left)(DO we really need all the data including topright??) for(index = 0; index < numberOfSamples; index++) { refLeft[index+size-1] = refSamples[refOffset - index]; - } + } } - + refSampMain = refLeft + (size - 1); - // Extend the Main reference to the left for angles with negative slope + // Extend the Main reference to the left for angles with negative slope refSampSide = refSamples + (size << 1); for(signIndex = -1; signIndex > (EB_S32)((EB_S32)size*intraPredAngle >> 5); --signIndex) { invAngleSum += invAngle; refSampMain[signIndex] = refSampSide[invAngleSum >> 8]; - } + } - - IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - size, + + IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3371,7 +3371,7 @@ static void IntraModeAngular16bit_11To17( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr EB_U16 *refLeft, - EB_BOOL *LeftReadyFlag) + EB_BOOL *LeftReadyFlag) { EB_U16 *refSampMain; EB_U16 *refSampSide; @@ -3379,7 +3379,7 @@ static void IntraModeAngular16bit_11To17( EB_S32 signIndex; const EB_U32 refOffset = (size << 1); EB_U32 index; - + EB_S32 intraPredAngle = intraModeAngularTableNegative[ mode - INTRA_HORIZONTAL_MODE]; EB_U32 invAngle = invIntraModeAngularTable[mode - INTRA_HORIZONTAL_MODE]; EB_U32 invAngleSum = 128; // rounding used for (shift by 8) @@ -3392,24 +3392,24 @@ static void IntraModeAngular16bit_11To17( // Copy left reference samples (inc top left)(DO we really need all the data including topright??) for(index = 0; index < numberOfSamples; index++) { refLeft[index+size-1] = refSamples[refOffset - index]; - } + } } - + refSampMain = refLeft + (size - 1); - // Extend the Main reference to the left for angles with negative slope + // Extend the Main reference to the left for angles with negative slope refSampSide = refSamples + (size << 1); for(signIndex = -1; signIndex > (EB_S32)((EB_S32)size*intraPredAngle >> 5); --signIndex) { invAngleSum += invAngle; refSampMain[signIndex] = refSampSide[invAngleSum >> 8]; - } + } + - IntraAngHorizontal_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - size, + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3428,15 +3428,15 @@ static void IntraModeAngular_3To9( const EB_U32 predictionBufferStride) //input parameter, denotes the stride for the prediction ptr { EB_U8 *refSampMain; - + EB_S32 intraPredAngle = (INTRA_HORIZONTAL_MODE - mode) < 9 ? intraModeAngularTable[INTRA_HORIZONTAL_MODE - mode]:0; - + refSampMain = refSamples-1; - - IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - size, + + IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3454,16 +3454,16 @@ static void IntraModeAngular16bit_3To9( const EB_U32 predictionBufferStride) //input parameter, denotes the stride for the prediction ptr { EB_U16 *refSampMain; - + EB_S32 intraPredAngle = (INTRA_HORIZONTAL_MODE - mode) < 9 ? intraModeAngularTable[INTRA_HORIZONTAL_MODE - mode] : 0; - + refSampMain = refSamples-1; - - IntraAngHorizontal_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - size, + + IntraAngHorizontal_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + size, refSampMain, - predictionPtr, + predictionPtr, predictionBufferStride, EB_FALSE, intraPredAngle); @@ -3488,7 +3488,7 @@ static inline void IntraModeAngular_all( EB_BOOL *LeftReadyFlag) { - + switch(mode){ case 34: @@ -3501,15 +3501,15 @@ static inline void IntraModeAngular_all( break; case 33: case 32: case 31: case 30: case 29: case 28: case 27: - IntraModeAngular_27To33( + IntraModeAngular_27To33( mode, puSize, refSamples, predictionPtr, predictionBufferStride); break; - case 25: case 24: case 23: case 22: case 21: case 20: case 19: - IntraModeAngular_19To25( + case 25: case 24: case 23: case 22: case 21: case 20: case 19: + IntraModeAngular_19To25( mode, puSize, refSamples, @@ -3527,7 +3527,7 @@ static inline void IntraModeAngular_all( EB_FALSE); break; case 17: case 16: case 15: case 14: case 13: case 12: case 11: - IntraModeAngular_11To17( + IntraModeAngular_11To17( mode, puSize, refSamples, @@ -3537,7 +3537,7 @@ static inline void IntraModeAngular_all( LeftReadyFlag); break; case 9: case 8: case 7: case 6: case 5: case 4: case 3: - IntraModeAngular_3To9( + IntraModeAngular_3To9( mode, puSize, refSamplesReverse, @@ -3545,7 +3545,7 @@ static inline void IntraModeAngular_all( predictionBufferStride); break; case 2: - + IntraAng2_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, refSamplesReverse, @@ -3571,7 +3571,7 @@ static inline void IntraModeAngular16bit_all( EB_BOOL *LeftReadyFlag) { - + switch(mode){ case 34: @@ -3591,8 +3591,8 @@ static inline void IntraModeAngular16bit_all( predictionPtr, predictionBufferStride); break; - case 25: case 24: case 23: case 22: case 21: case 20: case 19: - IntraModeAngular16bit_19To25( + case 25: case 24: case 23: case 22: case 21: case 20: case 19: + IntraModeAngular16bit_19To25( mode, puSize, refSamples, @@ -3620,7 +3620,7 @@ static inline void IntraModeAngular16bit_all( LeftReadyFlag); break; case 9: case 8: case 7: case 6: case 5: case 4: case 3: - IntraModeAngular16bit_3To9( + IntraModeAngular16bit_3To9( mode, puSize, refSamplesReverse, @@ -3628,7 +3628,7 @@ static inline void IntraModeAngular16bit_all( predictionBufferStride); break; case 2: - + IntraAng2_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, refSamplesReverse, @@ -3642,22 +3642,22 @@ static inline void IntraModeAngular16bit_all( is the main function to compute intra prediction for a PU */ EB_ERRORTYPE IntraPredictionCl( - ModeDecisionContext_t *mdContextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr) + ModeDecisionContext_t *mdContextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; const EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; EB_U32 chromaMode; - const EB_U32 puOriginX = mdContextPtr->cuOriginX; - const EB_U32 puOriginY = mdContextPtr->cuOriginY; - const EB_U32 puWidth = mdContextPtr->cuStats->size; - const EB_U32 puHeight = mdContextPtr->cuStats->size; + const EB_U32 puOriginX = mdContextPtr->cuOriginX; + const EB_U32 puOriginY = mdContextPtr->cuOriginY; + const EB_U32 puWidth = mdContextPtr->cuStats->size; + const EB_U32 puHeight = mdContextPtr->cuStats->size; - IntraReferenceSamples_t * const contextPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); - const EncodeContext_t * const encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + IntraReferenceSamples_t * const contextPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); + const EncodeContext_t * const encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; // Map the mode to the function table index EB_U32 funcIndex = @@ -3682,21 +3682,21 @@ EB_ERRORTYPE IntraPredictionCl( CHECK_REPORT_ERROR( - (puWidth == puHeight), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTRA_PRED_ERROR2); + (puWidth == puHeight), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTRA_PRED_ERROR2); - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) - { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) + { + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraLumaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); - } + GenerateIntraLumaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); + } puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); puSize = puWidth; @@ -3714,7 +3714,7 @@ EB_ERRORTYPE IntraPredictionCl( yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -3726,7 +3726,7 @@ EB_ERRORTYPE IntraPredictionCl( case 1: yIntraReferenceArray = contextPtr->yIntraReferenceArrayReverse; - + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, @@ -3737,11 +3737,11 @@ EB_ERRORTYPE IntraPredictionCl( break; case 2: - + yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - - + + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, @@ -3763,15 +3763,15 @@ EB_ERRORTYPE IntraPredictionCl( EB_FALSE); break; - + case 4: - + yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArray : contextPtr->yIntraReferenceArray; yIntraReferenceArrayReverse = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraModeAngular_all( + IntraModeAngular_all( lumaMode, puSize, yIntraReferenceArray, @@ -3788,19 +3788,19 @@ EB_ERRORTYPE IntraPredictionCl( default: break; } - } + } if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) - { + if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) + { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraChromaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + GenerateIntraChromaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); - } + } // The chromaMode is always DM chromaMode = (EB_U32) lumaMode; @@ -3815,20 +3815,20 @@ EB_ERRORTYPE IntraPredictionCl( switch(funcIndex) { case 0: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), candidateBufferPtr->predictionPtr->strideCb, EB_FALSE); } - + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3839,7 +3839,7 @@ EB_ERRORTYPE IntraPredictionCl( break; case 2: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( @@ -3849,10 +3849,10 @@ EB_ERRORTYPE IntraPredictionCl( candidateBufferPtr->predictionPtr->strideCb, EB_FALSE); } - + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3863,10 +3863,10 @@ EB_ERRORTYPE IntraPredictionCl( break; case 3: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -3876,7 +3876,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3887,20 +3887,20 @@ EB_ERRORTYPE IntraPredictionCl( break; case 1: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), candidateBufferPtr->predictionPtr->strideCb, EB_FALSE); } - + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3912,7 +3912,7 @@ EB_ERRORTYPE IntraPredictionCl( case 4: - // Cb Intra Prediction + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { IntraModeAngular_all( chromaMode, @@ -3927,7 +3927,7 @@ EB_ERRORTYPE IntraPredictionCl( & contextPtr->LeftReadyFlagCb); } - // Cr Intra Prediction + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { IntraModeAngular_all( chromaMode, @@ -3969,7 +3969,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( EB_U32 chromaMode; IntraReferenceSamples_t *contextPtr = (IntraReferenceSamples_t*)(((ModeDecisionContext_t*)predictionContextPtr)->intraRefPtr); - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; // Map the mode to the function table index EB_U32 funcIndex = @@ -3994,12 +3994,12 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( (void)pictureControlSetPtr; CHECK_REPORT_ERROR( - (puWidth == puHeight), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTRA_PRED_ERROR2); + (puWidth == puHeight), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTRA_PRED_ERROR2); if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - + lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; puOriginIndex = ((puOriginY & (lcuSize-1)) * candidateBufferPtr->predictionPtr->strideY) + (puOriginX & (lcuSize-1)); @@ -4019,7 +4019,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4031,8 +4031,8 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( case 1: yIntraReferenceArray = contextPtr->yIntraReferenceArrayReverse; - - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4042,12 +4042,12 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( break; case 2: - + yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - - - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4060,7 +4060,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4068,15 +4068,15 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( EB_FALSE); break; - + case 4: - + yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArray : contextPtr->yIntraReferenceArray; yIntraReferenceArrayReverse = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraModeAngular_all( + IntraModeAngular_all( lumaMode, puSize, yIntraReferenceArray, @@ -4093,7 +4093,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( default: break; } - } + } if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { @@ -4111,20 +4111,20 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( switch(funcIndex) { case 0: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), candidateBufferPtr->predictionPtr->strideCb, EB_FALSE); } - + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4135,20 +4135,20 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( break; case 2: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), candidateBufferPtr->predictionPtr->strideCb, EB_FALSE); } - + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4159,10 +4159,10 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( break; case 3: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -4172,7 +4172,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4183,20 +4183,20 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( break; case 1: - + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), candidateBufferPtr->predictionPtr->strideCb, EB_FALSE); } - + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4208,7 +4208,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( case 4: - // Cb Intra Prediction + // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { IntraModeAngular_all( chromaMode, @@ -4223,7 +4223,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( & contextPtr->LeftReadyFlagCb); } - // Cr Intra Prediction + // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { IntraModeAngular_all( chromaMode, @@ -4249,22 +4249,22 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( } EB_ERRORTYPE Intra4x4IntraPredictionOl( - EB_U32 puIndex, + EB_U32 puIndex, EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, EB_U32 lcuSize, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_PTR predictionContextPtr) + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_PTR predictionContextPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; EB_U32 openLoopIntraCandidateIndex = candidateBufferPtr->candidatePtr->intraLumaMode; const EB_U32 puOriginIndex = ((puOriginY & (lcuSize-1)) * candidateBufferPtr->predictionPtr->strideY) + (puOriginX & (lcuSize-1)); const EB_U32 puSize = puWidth; - + // Map the mode to the function table index EB_U32 funcIndex = (openLoopIntraCandidateIndex < 2) ? openLoopIntraCandidateIndex : @@ -4272,18 +4272,18 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( (openLoopIntraCandidateIndex == INTRA_HORIZONTAL_MODE) ? 3 : 4; - IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(((ModeDecisionContext_t*)predictionContextPtr)->intraRefPtr); + IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(((ModeDecisionContext_t*)predictionContextPtr)->intraRefPtr); (void) puHeight; - (void) componentMask; - (void) pictureControlSetPtr; - (void) puIndex; + (void) componentMask; + (void) pictureControlSetPtr; + (void) puIndex; switch(funcIndex) { case 0: - - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4293,8 +4293,8 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( break; case 1: - - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4304,8 +4304,8 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( break; case 2: - - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4315,8 +4315,8 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( break; case 3: - - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4326,8 +4326,8 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( break; case 4: - - IntraModeAngular_all( + + IntraModeAngular_all( openLoopIntraCandidateIndex, puSize, intraRefPtr->yIntraReferenceArray, @@ -4344,14 +4344,14 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( default: break; } - + return return_error; } /********************************************* * Encode Pass Intra Prediction - * Calculates a conformant H.265 prediction + * Calculates a conformant H.265 prediction * for an Intra Prediction Unit *********************************************/ EB_ERRORTYPE EncodePassIntraPrediction( @@ -4407,7 +4407,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( switch(lumaMode) { case EB_INTRA_PLANAR: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4417,7 +4417,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_DC: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4427,7 +4427,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_VERTICAL: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4437,7 +4437,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_HORIZONTAL: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4447,7 +4447,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; default: - IntraModeAngular_all( + IntraModeAngular_all( lumaMode, puSize, yIntraReferenceArray, @@ -4466,7 +4466,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( } } - + //*********************************** // Chroma //*********************************** @@ -4480,7 +4480,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( } chromaModeAdj = lumaMode; - chromaModeAdj = + chromaModeAdj = (chromaMode == EB_INTRA_CHROMA_PLANAR) ? EB_INTRA_PLANAR : (chromaMode == EB_INTRA_CHROMA_VERTICAL) ? EB_INTRA_VERTICAL : (chromaMode == EB_INTRA_CHROMA_HORIZONTAL) ? EB_INTRA_HORIZONTAL : @@ -4510,7 +4510,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( switch(chromaModeAdj) { case EB_INTRA_PLANAR: // Cb Intra Prediction - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, @@ -4518,7 +4518,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( EB_FALSE); // Cr Intra Prediction - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4528,17 +4528,17 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_VERTICAL: - + // Cb Intra Prediction - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, predictionPtr->strideCb, EB_FALSE); - + // Cr Intra Prediction - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4548,18 +4548,18 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_HORIZONTAL: - + // Cb Intra Prediction - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, predictionPtr->strideCb, EB_FALSE); - + // Cr Intra Prediction - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4569,18 +4569,18 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_DC: - + // Cb Intra Prediction - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, predictionPtr->strideCb, EB_FALSE); - + // Cr Intra Prediction - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4594,9 +4594,9 @@ EB_ERRORTYPE EncodePassIntraPrediction( // *Note - For Chroma DM mode, use the Luma Angular mode // to generate the prediction. - // Cb Intra Prediction + // Cb Intra Prediction IntraModeAngular_all( - chromaModeAdj, + chromaModeAdj, puChromaSize, cbIntraReferenceArray, cbIntraReferenceArrayReverse, @@ -4607,7 +4607,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( referenceSamples->ReferenceLeftLineCb, &referenceSamples->LeftReadyFlagCb); - // Cr Intra Prediction + // Cr Intra Prediction IntraModeAngular_all( chromaModeAdj, puChromaSize, @@ -4632,7 +4632,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( /********************************************* * Encode Pass Intra Prediction 16bit - * Calculates a conformant H.265 prediction + * Calculates a conformant H.265 prediction * for an Intra Prediction Unit *********************************************/ EB_ERRORTYPE EncodePassIntraPrediction16bit( @@ -4725,7 +4725,7 @@ EB_ERRORTYPE EncodePassIntraPrediction16bit( break; default: - IntraModeAngular16bit_all( + IntraModeAngular16bit_all( lumaMode, puSize, yIntraReferenceArray, @@ -4744,7 +4744,7 @@ EB_ERRORTYPE EncodePassIntraPrediction16bit( } } - + //*********************************** // Chroma //*********************************** @@ -4758,7 +4758,7 @@ EB_ERRORTYPE EncodePassIntraPrediction16bit( } chromaModeAdj = lumaMode; - chromaModeAdj = + chromaModeAdj = (chromaMode == EB_INTRA_CHROMA_PLANAR) ? EB_INTRA_PLANAR : (chromaMode == EB_INTRA_CHROMA_VERTICAL) ? EB_INTRA_VERTICAL : (chromaMode == EB_INTRA_CHROMA_HORIZONTAL) ? EB_INTRA_HORIZONTAL : @@ -4809,7 +4809,7 @@ EB_ERRORTYPE EncodePassIntraPrediction16bit( (EB_U16*)predictionPtr->bufferCb + chromaOffset, predictionPtr->strideCb, EB_FALSE); - + IntraVerticalChroma_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, @@ -4825,7 +4825,7 @@ EB_ERRORTYPE EncodePassIntraPrediction16bit( (EB_U16*)predictionPtr->bufferCb + chromaOffset, predictionPtr->strideCb, EB_FALSE); - + IntraHorzChroma_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, @@ -4855,7 +4855,7 @@ EB_ERRORTYPE EncodePassIntraPrediction16bit( // *Note - For Chroma DM mode, use the Luma Angular mode // to generate the prediction. IntraModeAngular16bit_all( - chromaModeAdj, + chromaModeAdj, puChromaSize, cbIntraReferenceArray, cbIntraReferenceArrayReverse, @@ -4899,19 +4899,19 @@ EB_ERRORTYPE IntraOpenLoopReferenceSamplesCtor( *contextDblPtr = contextPtr; EB_MALLOC(EB_U8*, contextPtr->yIntraReferenceArray, sizeof(EB_U8) * (4 * MAX_LCU_SIZE + 1), EB_N_PTR); - + EB_MALLOC(EB_U8*, contextPtr->yIntraReferenceArrayReverse, sizeof(EB_U8) * (4 * MAX_LCU_SIZE + 2), EB_N_PTR); contextPtr->yIntraReferenceArrayReverse++; - + return EB_ErrorNone; } - + EB_ERRORTYPE UpdateNeighborSamplesArrayOL( IntraReferenceSamples_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -4930,14 +4930,14 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( EB_U8 *yBorderReverse = intraRefPtr->yIntraReferenceArrayReverse; EB_U8 *yBorder = intraRefPtr->yIntraReferenceArray; EB_U8 *yBorderLoc; - EB_U32 width = inputPtr->width; - EB_U32 height = inputPtr->height; - EB_U32 blockSizeHalf = blockSize << 1; + EB_U32 width = inputPtr->width; + EB_U32 height = inputPtr->height; + EB_U32 blockSizeHalf = blockSize << 1; const EB_BOOL pictureLeftBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureLeftEdgeFlag == EB_TRUE && (srcOriginX & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; const EB_BOOL pictureTopBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureTopEdgeFlag == EB_TRUE && (srcOriginY & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; // Adjust the Source ptr to start at the origin of the block being updated - srcPtr = inputPtr->bufferY + (((srcOriginY + inputPtr->originY) * stride) + (srcOriginX + inputPtr->originX)); + srcPtr = inputPtr->bufferY + (((srcOriginY + inputPtr->originY) * stride) + (srcOriginX + inputPtr->originX)); // Adjust the Destination ptr to start at the origin of the Intra reference array dstPtr = yBorderReverse; @@ -4948,10 +4948,10 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( // Get the left-column count = blockSizeHalf; if (pictureLeftBoundary == EB_FALSE) { - + readPtr = srcPtr - 1; count = ((srcOriginY + count) > height) ? count - ((srcOriginY + count) - height) : count; - + for(idx = 0; idx < count; ++idx) { *dstPtr = *readPtr; @@ -4962,10 +4962,10 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( dstPtr += (blockSizeHalf- count); } else { - + dstPtr += count; } - + // Get the upper left sample if (pictureLeftBoundary == EB_FALSE && pictureTopBoundary == EB_FALSE) { @@ -4976,45 +4976,45 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( dstPtr ++; } - + // Get the top-row count = blockSizeHalf; if (pictureTopBoundary == EB_FALSE) { readPtr = srcPtr - stride; - + count = ((srcOriginX + count) > width) ? count - ((srcOriginX + count) - width) : count; - EB_MEMCPY(dstPtr, readPtr, count); + EB_MEMCPY(dstPtr, readPtr, count); dstPtr += (blockSizeHalf - count); } else { - + dstPtr += count; } - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagY = EB_FALSE; intraRefPtr->LeftReadyFlagY = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | <======= L6 | | + L1 | | <======= L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); yBorderLoc = yBorder + blockSizeHalf - 1 ; for(count = 0; count< blockSizeHalf; count++){ - + *yBorderLoc = yBorderReverse[count]; yBorderLoc--; } @@ -5024,7 +5024,7 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( IntraReferenceSamples_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -5043,133 +5043,133 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( EB_U8 *cbDstPtr; EB_U8 *cbReadPtr; - EB_U8 *crSrcPtr; + EB_U8 *crSrcPtr; EB_U8 *crDstPtr; EB_U8 *crReadPtr; EB_U32 count; EB_U8 *cbBorderReverse = intraRefPtr->cbIntraReferenceArrayReverse; - EB_U8 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; + EB_U8 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; EB_U8 *cbBorder = intraRefPtr->cbIntraReferenceArray; - EB_U8 *crBorder = intraRefPtr->crIntraReferenceArray; + EB_U8 *crBorder = intraRefPtr->crIntraReferenceArray; EB_U8 *cbBorderLoc; - EB_U8 *crBorderLoc; - EB_U32 width = inputPtr->width >> 1; - EB_U32 height = inputPtr->height >> 1; - EB_U32 blockSizeHalf = blockSize << 1; + EB_U8 *crBorderLoc; + EB_U32 width = inputPtr->width >> 1; + EB_U32 height = inputPtr->height >> 1; + EB_U32 blockSizeHalf = blockSize << 1; const EB_BOOL pictureLeftBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureLeftEdgeFlag == EB_TRUE && (srcOriginX & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; const EB_BOOL pictureTopBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureTopEdgeFlag == EB_TRUE && (srcOriginY & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; // Adjust the Source ptr to start at the origin of the block being updated - cbSrcPtr = inputPtr->bufferCb + (((cuChromaOriginY + (inputPtr->originY >> 1)) * cbStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); - crSrcPtr = inputPtr->bufferCr + (((cuChromaOriginY + (inputPtr->originY >> 1)) * crStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); + cbSrcPtr = inputPtr->bufferCb + (((cuChromaOriginY + (inputPtr->originY >> 1)) * cbStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); + crSrcPtr = inputPtr->bufferCr + (((cuChromaOriginY + (inputPtr->originY >> 1)) * crStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); // Adjust the Destination ptr to start at the origin of the Intra reference array - cbDstPtr = cbBorderReverse; + cbDstPtr = cbBorderReverse; crDstPtr = crBorderReverse; //Initialise the Luma Intra Reference Array to the mid range value 128 (for CUs at the picture boundaries) - EB_MEMSET(cbDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); - EB_MEMSET(crDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); + EB_MEMSET(cbDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); + EB_MEMSET(crDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); - (void)stride; + (void)stride; // Get the left-column count = blockSizeHalf; if (pictureLeftBoundary == EB_FALSE) { - + cbReadPtr = cbSrcPtr - 1; - crReadPtr = crSrcPtr - 1; + crReadPtr = crSrcPtr - 1; count = ((cuChromaOriginY + count) > height) ? count - ((cuChromaOriginY + count) - height) : count; - + for(idx = 0; idx < count; ++idx) { *cbDstPtr = *cbReadPtr; cbReadPtr += cbStride; cbDstPtr ++; - *crDstPtr = *crReadPtr; + *crDstPtr = *crReadPtr; crReadPtr += crStride; crDstPtr ++; } cbDstPtr += (blockSizeHalf- count); - crDstPtr += (blockSizeHalf- count); + crDstPtr += (blockSizeHalf- count); } else { - - cbDstPtr += count; + + cbDstPtr += count; crDstPtr += count; } - + // Get the upper left sample if (pictureLeftBoundary == EB_FALSE && pictureTopBoundary == EB_FALSE) { cbReadPtr = cbSrcPtr - cbStride- 1 ; *cbDstPtr = *cbReadPtr; cbDstPtr ++; - crReadPtr = crSrcPtr - crStride- 1 ; + crReadPtr = crSrcPtr - crStride- 1 ; *crDstPtr = *crReadPtr; crDstPtr ++; } else { cbDstPtr ++; - crDstPtr ++; + crDstPtr ++; } - + // Get the top-row count = blockSizeHalf; if (pictureTopBoundary == EB_FALSE) { cbReadPtr = cbSrcPtr - cbStride; - + count = ((cuChromaOriginX + count) > width) ? count - ((cuChromaOriginX + count) - width) : count; - EB_MEMCPY(cbDstPtr, cbReadPtr, count); + EB_MEMCPY(cbDstPtr, cbReadPtr, count); cbDstPtr += (blockSizeHalf - count); - crReadPtr = crSrcPtr - crStride; - EB_MEMCPY(crDstPtr, crReadPtr, count); + crReadPtr = crSrcPtr - crStride; + EB_MEMCPY(crDstPtr, crReadPtr, count); crDstPtr += (blockSizeHalf - count); } else { - + crDstPtr += count; } - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagCb = EB_FALSE; intraRefPtr->LeftReadyFlagCb = EB_FALSE; - intraRefPtr->AboveReadyFlagCr = EB_FALSE; + intraRefPtr->AboveReadyFlagCr = EB_FALSE; intraRefPtr->LeftReadyFlagCr = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | <======= L6 | | + L1 | | <======= L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - EB_MEMCPY(cbBorder + blockSizeHalf, cbBorderReverse + blockSizeHalf, blockSizeHalf + 1); - EB_MEMCPY(crBorder + blockSizeHalf, crBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(cbBorder + blockSizeHalf, cbBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(crBorder + blockSizeHalf, crBorderReverse + blockSizeHalf, blockSizeHalf + 1); cbBorderLoc = cbBorder + blockSizeHalf - 1 ; - crBorderLoc = crBorder + blockSizeHalf - 1 ; + crBorderLoc = crBorder + blockSizeHalf - 1 ; for(count = 0; count< blockSizeHalf; count++){ - + *cbBorderLoc = cbBorderReverse[count]; cbBorderLoc--; - *crBorderLoc = crBorderReverse[count]; + *crBorderLoc = crBorderReverse[count]; crBorderLoc--; } @@ -5181,7 +5181,7 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( */ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( IntraReferenceSamplesOpenLoop_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -5196,14 +5196,14 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( EB_U8 *readPtr; EB_U32 count; - + EB_U8 *yBorderReverse = intraRefPtr->yIntraReferenceArrayReverse; EB_U8 *yBorder = intraRefPtr->yIntraReferenceArray; EB_U8 *yBorderLoc; - EB_U32 width = inputPtr->width; - EB_U32 height = inputPtr->height; - EB_U32 blockSizeHalf = blockSize << 1; + EB_U32 width = inputPtr->width; + EB_U32 height = inputPtr->height; + EB_U32 blockSizeHalf = blockSize << 1; // Adjust the Source ptr to start at the origin of the block being updated srcPtr = inputPtr->bufferY + (((srcOriginY + inputPtr->originY) * stride) + (srcOriginX + inputPtr->originX)); @@ -5218,10 +5218,10 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( count = blockSizeHalf; if (srcOriginX != 0) { - + readPtr = srcPtr - 1; count = ((srcOriginY + count) > height) ? count - ((srcOriginY + count) - height) : count; - + for(idx = 0; idx < count; ++idx) { *dstPtr = *readPtr; @@ -5232,10 +5232,10 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( dstPtr += (blockSizeHalf- count); } else { - + dstPtr += count; } - + // Get the upper left sample if (srcOriginX != 0 && srcOriginY != 0) { @@ -5246,46 +5246,46 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( dstPtr ++; } - + // Get the top-row count = blockSizeHalf; if (srcOriginY != 0) { readPtr = srcPtr - stride; - + count = ((srcOriginX + count) > width) ? count - ((srcOriginX + count) - width) : count; - EB_MEMCPY(dstPtr, readPtr, count); + EB_MEMCPY(dstPtr, readPtr, count); dstPtr += (blockSizeHalf - count); } else { - + dstPtr += count; } - + //at the begining of a CU Loop, the Above/Left scratch buffers are not ready to be used. intraRefPtr->AboveReadyFlagY = EB_FALSE; intraRefPtr->LeftReadyFlagY = EB_FALSE; - //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples + //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples /* TL T0 T1 T2 T3 T4 T5 T6 T7 TL T0 T1 T2 T3 T4 T5 T6 T7 L0 |----------------| L7 |----------------| - L1 | | <======= L6 | | + L1 | | <======= L6 | | L2 | | L5 | | L3 |----------------| L4 |----------------| - L4 L3 + L4 L3 L5 L2 L6 L1 - L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order + L7 <-- pointer (Regular Order) L0<-- pointer Reverse Order junk - */ + */ - EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); yBorderLoc = yBorder + blockSizeHalf - 1 ; for(count = 0; countintraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5325,8 +5325,8 @@ EB_ERRORTYPE IntraPredictionOpenLoop( break; case 1: - - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( cuSize, contextPtr->intraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5336,8 +5336,8 @@ EB_ERRORTYPE IntraPredictionOpenLoop( break; case 2: - - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( cuSize, contextPtr->intraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5347,8 +5347,8 @@ EB_ERRORTYPE IntraPredictionOpenLoop( break; case 3: - - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( cuSize, contextPtr->intraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5358,8 +5358,8 @@ EB_ERRORTYPE IntraPredictionOpenLoop( break; case 4: - - IntraModeAngular_all( + + IntraModeAngular_all( openLoopIntraCandidateIndex, cuSize, contextPtr->intraRefPtr->yIntraReferenceArray, @@ -5376,7 +5376,7 @@ EB_ERRORTYPE IntraPredictionOpenLoop( default: break; } - + return return_error; } @@ -5385,25 +5385,25 @@ EB_ERRORTYPE IntraPredictionOpenLoop( performs Open-loop Intra candidate Search for a CU */ EB_ERRORTYPE IntraPredictionOl( - ModeDecisionContext_t *mdContextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr) + ModeDecisionContext_t *mdContextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 puOriginX = mdContextPtr->cuOriginX; - EB_U32 puOriginY = mdContextPtr->cuOriginY; - EB_U32 puWidth = mdContextPtr->cuStats->size; - EB_U32 puHeight = mdContextPtr->cuStats->size; - const EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); + EB_U32 puOriginX = mdContextPtr->cuOriginX; + EB_U32 puOriginY = mdContextPtr->cuOriginY; + EB_U32 puWidth = mdContextPtr->cuStats->size; + EB_U32 puHeight = mdContextPtr->cuStats->size; + const EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); EB_U32 openLoopIntraCandidateIndex = candidateBufferPtr->candidatePtr->intraLumaMode; - + const EB_U32 puSize = puWidth; const EB_U32 puIndex = mdContextPtr->puItr; - + // Map the mode to the function table index EB_U32 funcIndex = (openLoopIntraCandidateIndex < 2) ? openLoopIntraCandidateIndex : @@ -5411,252 +5411,252 @@ EB_ERRORTYPE IntraPredictionOl( (openLoopIntraCandidateIndex == INTRA_HORIZONTAL_MODE) ? 3 : 4; - IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); + IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); (void) puHeight; - (void) pictureControlSetPtr; - (void) puIndex; + (void) pictureControlSetPtr; + (void) puIndex; - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) - { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) + { + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraLumaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); - } + GenerateIntraLumaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); + } - switch (funcIndex) { + switch (funcIndex) { - case 0: + case 0: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 1: + case 1: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 2: + case 2: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 3: + case 3: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 4: + case 4: - IntraModeAngular_all( - openLoopIntraCandidateIndex, - puSize, - intraRefPtr->yIntraReferenceArray, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - intraRefPtr->ReferenceAboveLineY, - &intraRefPtr->AboveReadyFlagY, - intraRefPtr->ReferenceLeftLineY, - &intraRefPtr->LeftReadyFlagY); + IntraModeAngular_all( + openLoopIntraCandidateIndex, + puSize, + intraRefPtr->yIntraReferenceArray, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + intraRefPtr->ReferenceAboveLineY, + &intraRefPtr->AboveReadyFlagY, + intraRefPtr->ReferenceLeftLineY, + &intraRefPtr->LeftReadyFlagY); - break; + break; - default: - break; - } - } + default: + break; + } + } - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) - { + if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) + { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraChromaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); + GenerateIntraChromaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); - } + } - // The chromaMode is always DM - EB_U32 chromaMode = (EB_U32)openLoopIntraCandidateIndex; + // The chromaMode is always DM + EB_U32 chromaMode = (EB_U32)openLoopIntraCandidateIndex; EB_U32 puChromaOriginIndex = (((puOriginY & (63)) * 32) + (puOriginX & (63)))>>1; - EB_U32 chromaPuSize = puWidth >> 1; - - intraRefPtr->AboveReadyFlagCb = EB_FALSE; - intraRefPtr->AboveReadyFlagCr = EB_FALSE; - intraRefPtr->LeftReadyFlagCb = EB_FALSE; - intraRefPtr->LeftReadyFlagCr = EB_FALSE; - - switch (funcIndex) { - - case 0: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 2: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArray, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - candidateBufferPtr->predictionPtr->strideCb, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArray, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 3: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 1: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 4: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraModeAngular_all( - chromaMode, - chromaPuSize, - intraRefPtr->cbIntraReferenceArray, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - candidateBufferPtr->predictionPtr->strideCb, - intraRefPtr->ReferenceAboveLineCb, - &intraRefPtr->AboveReadyFlagCb, - intraRefPtr->ReferenceLeftLineCb, - &intraRefPtr->LeftReadyFlagCb); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraModeAngular_all( - chromaMode, - chromaPuSize, - intraRefPtr->crIntraReferenceArray, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - candidateBufferPtr->predictionPtr->strideCr, - intraRefPtr->ReferenceAboveLineCr, - &intraRefPtr->AboveReadyFlagCr, - intraRefPtr->ReferenceLeftLineCr, - &intraRefPtr->LeftReadyFlagCr); - } - - break; - - default: - break; - } - } - + EB_U32 chromaPuSize = puWidth >> 1; + + intraRefPtr->AboveReadyFlagCb = EB_FALSE; + intraRefPtr->AboveReadyFlagCr = EB_FALSE; + intraRefPtr->LeftReadyFlagCb = EB_FALSE; + intraRefPtr->LeftReadyFlagCr = EB_FALSE; + + switch (funcIndex) { + + case 0: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 2: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArray, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + candidateBufferPtr->predictionPtr->strideCb, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArray, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 3: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 1: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 4: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraModeAngular_all( + chromaMode, + chromaPuSize, + intraRefPtr->cbIntraReferenceArray, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + candidateBufferPtr->predictionPtr->strideCb, + intraRefPtr->ReferenceAboveLineCb, + &intraRefPtr->AboveReadyFlagCb, + intraRefPtr->ReferenceLeftLineCb, + &intraRefPtr->LeftReadyFlagCb); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraModeAngular_all( + chromaMode, + chromaPuSize, + intraRefPtr->crIntraReferenceArray, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + candidateBufferPtr->predictionPtr->strideCr, + intraRefPtr->ReferenceAboveLineCr, + &intraRefPtr->AboveReadyFlagCr, + intraRefPtr->ReferenceLeftLineCr, + &intraRefPtr->LeftReadyFlagCr); + } + + break; + + default: + break; + } + } + return return_error; } @@ -5671,10 +5671,10 @@ EB_ERRORTYPE IntraPredOnSrc( EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 puOriginX = mdContextPtr->cuOriginX; - EB_U32 puOriginY = mdContextPtr->cuOriginY; - EB_U32 puWidth = mdContextPtr->cuStats->size; - EB_U32 puHeight = mdContextPtr->cuStats->size; + EB_U32 puOriginX = mdContextPtr->cuOriginX; + EB_U32 puOriginY = mdContextPtr->cuOriginY; + EB_U32 puWidth = mdContextPtr->cuStats->size; + EB_U32 puHeight = mdContextPtr->cuStats->size; const EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); EB_U32 openLoopIntraCandidateIndex = intraMode; @@ -5711,7 +5711,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 0: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), @@ -5722,7 +5722,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 1: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), @@ -5733,7 +5733,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 2: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), @@ -5744,7 +5744,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 3: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), diff --git a/Source/Lib/Codec/EbIntraPrediction.h b/Source/Lib/Codec/EbIntraPrediction.h index cdc5e0716..ac31a9491 100644 --- a/Source/Lib/Codec/EbIntraPrediction.h +++ b/Source/Lib/Codec/EbIntraPrediction.h @@ -25,7 +25,7 @@ #ifdef __cplusplus extern "C" { #endif -#define MAX_PU_SIZE 64 +#define MAX_PU_SIZE 64 struct ModeDecisionContext_s; @@ -38,7 +38,7 @@ typedef struct IntraReferenceSamples_s { EB_U8 *cbIntraFilteredReferenceArray; EB_U8 *crIntraFilteredReferenceArray; - EB_U8 *yIntraReferenceArrayReverse; + EB_U8 *yIntraReferenceArrayReverse; EB_U8 *yIntraFilteredReferenceArrayReverse; EB_U8 *cbIntraReferenceArrayReverse; EB_U8 *cbIntraFilteredReferenceArrayReverse; @@ -72,7 +72,7 @@ typedef struct IntraReference16bitSamples_s { EB_U16 *cbIntraFilteredReferenceArray; EB_U16 *crIntraFilteredReferenceArray; - EB_U16 *yIntraReferenceArrayReverse; + EB_U16 *yIntraReferenceArrayReverse; EB_U16 *yIntraFilteredReferenceArrayReverse; EB_U16 *cbIntraReferenceArrayReverse; EB_U16 *cbIntraFilteredReferenceArrayReverse; @@ -233,16 +233,16 @@ extern EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( EB_BOOL pictureRightBoundary); extern EB_ERRORTYPE IntraPredictionCl( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr); extern EB_ERRORTYPE IntraPredictionOl( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr); extern EB_ERRORTYPE EncodePassIntraPrediction( void *refSamples, @@ -356,7 +356,7 @@ static const EB_U32 chromaMappingTable[] = { extern EB_ERRORTYPE UpdateNeighborSamplesArrayOL( IntraReferenceSamples_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -365,11 +365,11 @@ extern EB_ERRORTYPE UpdateNeighborSamplesArrayOL( extern EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( IntraReferenceSamples_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, - EB_U32 cbStride, + EB_U32 cbStride, EB_U32 crStride, EB_U32 cuChromaOriginX, EB_U32 cuChromaOriginY, @@ -390,7 +390,7 @@ extern EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( EB_U32 blockSize); extern EB_ERRORTYPE IntraPredictionOpenLoop( - EB_U32 cuSize, + EB_U32 cuSize, MotionEstimationContext_t *contextPtr, EB_U32 openLoopIntraCandidate); @@ -408,24 +408,24 @@ extern EB_ERRORTYPE Intra4x4IntraPredictionCl( EB_PTR predictionContextPtr); extern EB_ERRORTYPE Intra4x4IntraPredictionOl( - EB_U32 puIndex, + EB_U32 puIndex, EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, EB_U32 lcuSize, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_PTR predictionContextPtr); + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_PTR predictionContextPtr); extern void GenerateIntraLumaReferenceSamplesMd( - struct ModeDecisionContext_s *mdContextPtr, - EbPictureBufferDesc_t *inputPicturePtr); + struct ModeDecisionContext_s *mdContextPtr, + EbPictureBufferDesc_t *inputPicturePtr); extern void GenerateIntraChromaReferenceSamplesMd( - struct ModeDecisionContext_s *mdContextPtr, - EbPictureBufferDesc_t *inputPicturePtr); + struct ModeDecisionContext_s *mdContextPtr, + EbPictureBufferDesc_t *inputPicturePtr); /*************************************** * Function Ptr Types @@ -438,11 +438,11 @@ typedef void(*EB_INTRA_NOANG_TYPE)( const EB_BOOL skip); typedef EB_U32(*EB_NEIGHBOR_DC_INTRA_TYPE)( - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr, - EB_U32 srcOriginX, - EB_U32 srcOriginY, - EB_U32 blockSize); + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr, + EB_U32 srcOriginX, + EB_U32 srcOriginY, + EB_U32 blockSize); typedef void(*EB_INTRA_NOANG_16bit_TYPE)( const EB_U32 size, @@ -463,7 +463,7 @@ typedef void(*EB_INTRA_ANG_16BIT_TYPE)( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip, EB_S32 intraPredAngle); @@ -533,15 +533,15 @@ static EB_INTRA_NOANG_TYPE FUNC_TABLE IntraDCLuma_funcPtrArray[EB_ASM_TYPE_TOTAL IntraModeDCLuma, // AVX2 IntraModeDCLuma_AVX2_INTRIN, - + }; EB_U32 UpdateNeighborDcIntraPred( - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr, - EB_U32 srcOriginX, - EB_U32 srcOriginY, - EB_U32 blockSize); + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr, + EB_U32 srcOriginX, + EB_U32 srcOriginY, + EB_U32 blockSize); static EB_INTRA_NOANG_16bit_TYPE FUNC_TABLE IntraDCLuma_16bit_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT diff --git a/Source/Lib/Codec/EbMcp.c b/Source/Lib/Codec/EbMcp.c index e2986d62a..5227a62ce 100644 --- a/Source/Lib/Codec/EbMcp.c +++ b/Source/Lib/Codec/EbMcp.c @@ -25,7 +25,7 @@ EB_ERRORTYPE MotionCompensationPredictionContextCtor( MotionCompensationPredictionContext_t **contextDblPtr, - EB_U16 maxCUWidth, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit) @@ -60,10 +60,10 @@ EB_ERRORTYPE MotionCompensationPredictionContextCtor( initData.maxHeight = maxCUHeight + 16; // +8 needed for interpolation; the rest to accommodate MCP assembly kernels initData.bitDepth = EB_16BIT; initData.colorFormat = EB_YUV420; - initData.leftPadding = 0; - initData.rightPadding = 0; - initData.topPadding = 0; - initData.botPadding = 0; + initData.leftPadding = 0; + initData.rightPadding = 0; + initData.topPadding = 0; + initData.botPadding = 0; initData.splitMode = EB_FALSE; @@ -97,79 +97,79 @@ EB_ERRORTYPE MotionCompensationPredictionContextCtor( } void UniPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPic, - EB_U32 posX, - EB_U32 posY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *tempBuf0, - EB_S16 *tempBuf1, - EB_BOOL is16bit, - EB_U32 componentMask) + EbPictureBufferDesc_t *refPic, + EB_U32 posX, + EB_U32 posY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *dst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *tempBuf0, + EB_S16 *tempBuf1, + EB_BOOL is16bit, + EB_U32 componentMask) { - EB_U32 integPosx; - EB_U32 integPosy; - EB_U8 fracPosx; - EB_U8 fracPosy; - EB_U32 chromaPuWidth = puWidth >> 1; - EB_U32 chromaPuHeight = puHeight >> 1; - - - (void)tempBuf1; - - //luma - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - //compute the luma fractional position - integPosx = (posX >> 2); - integPosy = (posY >> 2); - fracPosx = posX & 0x03; - fracPosy = posY & 0x03; - - uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - is16bit ? refPic->bufferY + 4 + 4 * refPic->strideY : refPic->bufferY + integPosx + integPosy*refPic->strideY, - refPic->strideY, - dst->bufferY + dstLumaIndex, - dst->strideY, - puWidth, - puHeight, - tempBuf0); - } - - //chroma - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - //compute the chroma fractional position - integPosx = (posX >> 3); - integPosy = (posY >> 3); - fracPosx = posX & 0x07; - fracPosy = posY & 0x07; - - - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16bit ? refPic->bufferCb + 2 + 2 * refPic->strideCb : refPic->bufferCb + integPosx + integPosy * refPic->strideCb, - refPic->strideCb, - dst->bufferCb + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16bit ? refPic->bufferCr + 2 + 2 * refPic->strideCr : refPic->bufferCr + integPosx + integPosy * refPic->strideCr, - refPic->strideCr, - dst->bufferCr + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - } //input parameter, please refer to the detailed explanation above. + EB_U32 integPosx; + EB_U32 integPosy; + EB_U8 fracPosx; + EB_U8 fracPosy; + EB_U32 chromaPuWidth = puWidth >> 1; + EB_U32 chromaPuHeight = puHeight >> 1; + + + (void)tempBuf1; + + //luma + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + //compute the luma fractional position + integPosx = (posX >> 2); + integPosy = (posY >> 2); + fracPosx = posX & 0x03; + fracPosy = posY & 0x03; + + uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + is16bit ? refPic->bufferY + 4 + 4 * refPic->strideY : refPic->bufferY + integPosx + integPosy*refPic->strideY, + refPic->strideY, + dst->bufferY + dstLumaIndex, + dst->strideY, + puWidth, + puHeight, + tempBuf0); + } + + //chroma + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + //compute the chroma fractional position + integPosx = (posX >> 3); + integPosy = (posY >> 3); + fracPosx = posX & 0x07; + fracPosy = posY & 0x07; + + + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16bit ? refPic->bufferCb + 2 + 2 * refPic->strideCb : refPic->bufferCb + integPosx + integPosy * refPic->strideCb, + refPic->strideCb, + dst->bufferCb + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16bit ? refPic->bufferCr + 2 + 2 * refPic->strideCr : refPic->bufferCr + integPosx + integPosy * refPic->strideCr, + refPic->strideCr, + dst->bufferCr + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + } //input parameter, please refer to the detailed explanation above. } void EncodeUniPredInterpolation( @@ -194,10 +194,10 @@ void EncodeUniPredInterpolation( EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; EB_U32 chromaPuWidth = puWidth >> subWidthCMinus1; EB_U32 chromaPuHeight = puHeight >> subHeightCMinus1; - + (void)tempBuf1; - + //luma //compute the luma fractional position integPosx = (posX >> 2); @@ -205,14 +205,14 @@ void EncodeUniPredInterpolation( fracPosx = posX & 0x03; fracPosy = posY & 0x03; - uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - refPic->bufferY + integPosx + integPosy*refPic->strideY, - refPic->strideY, - dst->bufferY + dstLumaIndex, - dst->strideY, - puWidth, - puHeight, - tempBuf0); + uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + refPic->bufferY + integPosx + integPosy*refPic->strideY, + refPic->strideY, + dst->bufferY + dstLumaIndex, + dst->strideY, + puWidth, + puHeight, + tempBuf0); //chroma //compute the chroma fractional position @@ -221,29 +221,29 @@ void EncodeUniPredInterpolation( fracPosx = (posX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); fracPosy = (posY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPic->bufferCb + integPosx + integPosy*refPic->strideCb, - refPic->strideCb, - dst->bufferCb + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPic->bufferCr + integPosx + integPosy*refPic->strideCr, - refPic->strideCr, - dst->bufferCr + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); + + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPic->bufferCb + integPosx + integPosy*refPic->strideCb, + refPic->strideCb, + dst->bufferCb + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPic->bufferCr + integPosx + integPosy*refPic->strideCr, + refPic->strideCr, + dst->bufferCr + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); } void UniPredInterpolation16bit( @@ -278,14 +278,14 @@ void UniPredInterpolation16bit( fracPosx = posX & 0x03; fracPosy = posY & 0x03; - uniPredLuma16bitIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - (EB_U16 *)fullPelBlock->bufferY + 4 + 4 * fullPelBlock->strideY, - fullPelBlock->strideY, - (EB_U16*)(dst->bufferY) + dstLumaIndex, - dst->strideY, - puWidth, - puHeight, - tempBuf0); + uniPredLuma16bitIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + (EB_U16 *)fullPelBlock->bufferY + 4 + 4 * fullPelBlock->strideY, + fullPelBlock->strideY, + (EB_U16*)(dst->bufferY) + dstLumaIndex, + dst->strideY, + puWidth, + puHeight, + tempBuf0); //chroma //compute the chroma fractional position @@ -294,267 +294,267 @@ void UniPredInterpolation16bit( fracPosx = (posX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); fracPosy = (posY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); - uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlock->bufferCb + 2 + 2 * fullPelBlock->strideCb, - fullPelBlock->strideCb, - (EB_U16*)(dst->bufferCb) + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - - uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlock->bufferCr + 2 + 2 * fullPelBlock->strideCr, - fullPelBlock->strideCr, - (EB_U16*)(dst->bufferCr) + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - + uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlock->bufferCb + 2 + 2 * fullPelBlock->strideCb, + fullPelBlock->strideCb, + (EB_U16*)(dst->bufferCb) + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + + uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlock->bufferCr + 2 + 2 * fullPelBlock->strideCr, + fullPelBlock->strideCr, + (EB_U16*)(dst->bufferCr) + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + } void BiPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPicList0, - EbPictureBufferDesc_t *refPicList1, - EB_U32 refList0PosX, - EB_U32 refList0PosY, - EB_U32 refList1PosX, - EB_U32 refList1PosY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *refList0TempDst, - EB_S16 *refList1TempDst, - EB_S16 *fistPassIFTempDst, - EB_BOOL is16Bit, - EB_U32 componentMask) + EbPictureBufferDesc_t *refPicList0, + EbPictureBufferDesc_t *refPicList1, + EB_U32 refList0PosX, + EB_U32 refList0PosY, + EB_U32 refList1PosX, + EB_U32 refList1PosY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *biDst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *refList0TempDst, + EB_S16 *refList1TempDst, + EB_S16 *fistPassIFTempDst, + EB_BOOL is16Bit, + EB_U32 componentMask) { - EB_U32 integPosx; - EB_U32 integPosy; - EB_U8 fracPosx; - EB_U8 fracPosy; - EB_U32 chromaPuWidth = puWidth >> 1; - EB_U32 chromaPuHeight = puHeight >> 1; - EB_U32 lumaTempBufSize = puWidth * puHeight; - EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; - - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0x, fracPosL1x; - EB_U8 fracPosL0y, fracPosL1y; - - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - //compute the luma fractional position - integPosL0x = (refList0PosX >> 2); - integPosL0y = (refList0PosY >> 2); - fracPosL0x = refList0PosX & 0x03; - fracPosL0y = refList0PosY & 0x03; - - - //uni-prediction List1 luma - - //compute the luma fractional position - integPosL1x = (refList1PosX >> 2); - integPosL1y = (refList1PosY >> 2); - fracPosL1x = refList1PosX & 0x03; - fracPosL1y = refList1PosY & 0x03; - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, - refPicList0->strideY, - is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, - refPicList1->strideY, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, - puHeight, - Offset5, - EB_TRUE); - } - else - { - //uni-prediction List0 luma - //compute the luma fractional position - integPosx = (refList0PosX >> 2); - integPosy = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - // Note: SSSE3 Interpolation can only be enabled if - // SSSE3 clipping functions are enabled - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, - refPicList0->strideY, - refList0TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - //uni-prediction List1 luma - //compute the luma fractional position - integPosx = (refList1PosX >> 2); - integPosy = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, - refPicList1->strideY, - refList1TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - // bi-pred luma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puWidth, - puHeight, - refList0TempDst, - refList1TempDst, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - Offset5); - } - } - - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosL0x = (refList0PosX >> 3); - integPosL0y = (refList0PosY >> 3); - fracPosL0x = refList0PosX & 0x07; - fracPosL0y = refList0PosY & 0x07; - - //uni-prediction List1 chroma - //compute the chroma fractional position - integPosL1x = (refList1PosX >> 3); - integPosL1y = (refList1PosY >> 3); - fracPosL1x = refList1PosX & 0x07; - fracPosL1y = refList1PosY & 0x07; - - if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, - refPicList0->strideCb, - is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, - refPicList1->strideCb, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, - refPicList0->strideCr, - is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, - refPicList1->strideCr, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - } - else - { - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosx = (refList0PosX >> 3); - integPosy = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, - refPicList0->strideCb, - refList0TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, - refPicList0->strideCr, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //uni-prediction List1 chroma - //compute the chroma fractional position - integPosx = (refList1PosX >> 3); - integPosy = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, - refPicList1->strideCb, - refList1TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, - refPicList1->strideCr, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - // bi-pred chroma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize, - refList1TempDst + lumaTempBufSize, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - ChromaOffset5); - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - ChromaOffset5); - } - } - - - return; + EB_U32 integPosx; + EB_U32 integPosy; + EB_U8 fracPosx; + EB_U8 fracPosy; + EB_U32 chromaPuWidth = puWidth >> 1; + EB_U32 chromaPuHeight = puHeight >> 1; + EB_U32 lumaTempBufSize = puWidth * puHeight; + EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; + + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0x, fracPosL1x; + EB_U8 fracPosL0y, fracPosL1y; + + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + //compute the luma fractional position + integPosL0x = (refList0PosX >> 2); + integPosL0y = (refList0PosY >> 2); + fracPosL0x = refList0PosX & 0x03; + fracPosL0y = refList0PosY & 0x03; + + + //uni-prediction List1 luma + + //compute the luma fractional position + integPosL1x = (refList1PosX >> 2); + integPosL1y = (refList1PosY >> 2); + fracPosL1x = refList1PosX & 0x03; + fracPosL1y = refList1PosY & 0x03; + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, + refPicList0->strideY, + is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, + refPicList1->strideY, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, + puHeight, + Offset5, + EB_TRUE); + } + else + { + //uni-prediction List0 luma + //compute the luma fractional position + integPosx = (refList0PosX >> 2); + integPosy = (refList0PosY >> 2); + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + // Note: SSSE3 Interpolation can only be enabled if + // SSSE3 clipping functions are enabled + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, + refPicList0->strideY, + refList0TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + //uni-prediction List1 luma + //compute the luma fractional position + integPosx = (refList1PosX >> 2); + integPosy = (refList1PosY >> 2); + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, + refPicList1->strideY, + refList1TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + // bi-pred luma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puWidth, + puHeight, + refList0TempDst, + refList1TempDst, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + Offset5); + } + } + + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosL0x = (refList0PosX >> 3); + integPosL0y = (refList0PosY >> 3); + fracPosL0x = refList0PosX & 0x07; + fracPosL0y = refList0PosY & 0x07; + + //uni-prediction List1 chroma + //compute the chroma fractional position + integPosL1x = (refList1PosX >> 3); + integPosL1y = (refList1PosY >> 3); + fracPosL1x = refList1PosX & 0x07; + fracPosL1y = refList1PosY & 0x07; + + if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, + refPicList0->strideCb, + is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, + refPicList1->strideCb, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, + refPicList0->strideCr, + is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, + refPicList1->strideCr, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + } + else + { + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosx = (refList0PosX >> 3); + integPosy = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, + refPicList0->strideCb, + refList0TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, + refPicList0->strideCr, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //uni-prediction List1 chroma + //compute the chroma fractional position + integPosx = (refList1PosX >> 3); + integPosy = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, + refPicList1->strideCb, + refList1TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, + refPicList1->strideCr, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + // bi-pred chroma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize, + refList1TempDst + lumaTempBufSize, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + ChromaOffset5); + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + ChromaOffset5); + } + } + + + return; } @@ -589,213 +589,213 @@ void EncodeBiPredInterpolation( EB_U32 lumaTempBufSize = puWidth * puHeight; EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0x, fracPosL1x; - EB_U8 fracPosL0y, fracPosL1y; - //compute the luma fractional position - integPosL0x = (refList0PosX >> 2); - integPosL0y = (refList0PosY >> 2); - fracPosL0x = refList0PosX & 0x03; - fracPosL0y = refList0PosY & 0x03; - - - //uni-prediction List1 luma - //compute the luma fractional position - integPosL1x = (refList1PosX >> 2); - integPosL1y = (refList1PosY >> 2); - fracPosL1x = refList1PosX & 0x03; - fracPosL1y = refList1PosY & 0x03; - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, - refPicList0->strideY, - refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, - refPicList1->strideY, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, - puHeight, - Offset5, - EB_TRUE); - } - else - { - //uni-prediction List0 luma - //compute the luma fractional position - integPosx = (refList0PosX >> 2); - integPosy = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - // Note: SSSE3 Interpolation can only be enabled if - // SSSE3 clipping functions are enabled - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, - refPicList0->strideY, - refList0TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - //uni-prediction List1 luma - //compute the luma fractional position - integPosx = (refList1PosX >> 2); - integPosy = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, - refPicList1->strideY, - refList1TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - // bi-pred luma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puWidth, - puHeight, - refList0TempDst, - refList1TempDst, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - Offset5); - } - - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosL0x = (refList0PosX >> (2 + subWidthCMinus1)); - integPosL0y = (refList0PosY >> (2 + subHeightCMinus1)); - fracPosL0x = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosL0y = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - - //uni-prediction List1 chroma - //compute the chroma fractional position - integPosL1x = (refList1PosX >> (2 + subWidthCMinus1)); - integPosL1y = (refList1PosY >> (2 + subHeightCMinus1)); - fracPosL1x = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosL1y = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, - refPicList0->strideCb, - refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, - refPicList1->strideCb, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, - refPicList0->strideCr, - refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, - refPicList1->strideCr, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - } - else - { - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosx = (refList0PosX >> (2 + subWidthCMinus1)); - integPosy = (refList0PosY >> (2 + subHeightCMinus1)); - fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, - refPicList0->strideCb, - refList0TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, - refPicList0->strideCr, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //uni-prediction List1 chroma - //compute the chroma fractional position - //integPosx = (refList1PosX >> 3); - //integPosy = (refList1PosY >> 3); - //fracPosx = refList1PosX & 0x07; - //fracPosy = refList1PosY & 0x07; - - integPosx = (refList1PosX >> (2 + subWidthCMinus1)); - integPosy = (refList1PosY >> (2 + subHeightCMinus1)); - fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, - refPicList1->strideCb, - refList1TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, - refPicList1->strideCr, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - // bi-pred chroma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize, - refList1TempDst + lumaTempBufSize, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - ChromaOffset5); - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - ChromaOffset5); - } + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0x, fracPosL1x; + EB_U8 fracPosL0y, fracPosL1y; + //compute the luma fractional position + integPosL0x = (refList0PosX >> 2); + integPosL0y = (refList0PosY >> 2); + fracPosL0x = refList0PosX & 0x03; + fracPosL0y = refList0PosY & 0x03; + + + //uni-prediction List1 luma + //compute the luma fractional position + integPosL1x = (refList1PosX >> 2); + integPosL1y = (refList1PosY >> 2); + fracPosL1x = refList1PosX & 0x03; + fracPosL1y = refList1PosY & 0x03; + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, + refPicList0->strideY, + refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, + refPicList1->strideY, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, + puHeight, + Offset5, + EB_TRUE); + } + else + { + //uni-prediction List0 luma + //compute the luma fractional position + integPosx = (refList0PosX >> 2); + integPosy = (refList0PosY >> 2); + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + // Note: SSSE3 Interpolation can only be enabled if + // SSSE3 clipping functions are enabled + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, + refPicList0->strideY, + refList0TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + //uni-prediction List1 luma + //compute the luma fractional position + integPosx = (refList1PosX >> 2); + integPosy = (refList1PosY >> 2); + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, + refPicList1->strideY, + refList1TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + // bi-pred luma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puWidth, + puHeight, + refList0TempDst, + refList1TempDst, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + Offset5); + } + + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosL0x = (refList0PosX >> (2 + subWidthCMinus1)); + integPosL0y = (refList0PosY >> (2 + subHeightCMinus1)); + fracPosL0x = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosL0y = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + + //uni-prediction List1 chroma + //compute the chroma fractional position + integPosL1x = (refList1PosX >> (2 + subWidthCMinus1)); + integPosL1y = (refList1PosY >> (2 + subHeightCMinus1)); + fracPosL1x = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosL1y = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, + refPicList0->strideCb, + refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, + refPicList1->strideCb, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, + refPicList0->strideCr, + refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, + refPicList1->strideCr, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + } + else + { + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosx = (refList0PosX >> (2 + subWidthCMinus1)); + integPosy = (refList0PosY >> (2 + subHeightCMinus1)); + fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, + refPicList0->strideCb, + refList0TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, + refPicList0->strideCr, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //uni-prediction List1 chroma + //compute the chroma fractional position + //integPosx = (refList1PosX >> 3); + //integPosy = (refList1PosY >> 3); + //fracPosx = refList1PosX & 0x07; + //fracPosy = refList1PosY & 0x07; + + integPosx = (refList1PosX >> (2 + subWidthCMinus1)); + integPosy = (refList1PosY >> (2 + subHeightCMinus1)); + fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, + refPicList1->strideCb, + refList1TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, + refPicList1->strideCr, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + // bi-pred chroma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize, + refList1TempDst + lumaTempBufSize, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + ChromaOffset5); + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + ChromaOffset5); + } return; @@ -817,199 +817,199 @@ void BiPredInterpolation16bit( EB_S16 *refList1TempDst, EB_S16 *fistPassIFTempDst) { - //EB_U32 integPosx; - //EB_U32 integPosy; - EB_U8 fracPosx; - EB_U8 fracPosy; + //EB_U32 integPosx; + //EB_U32 integPosy; + EB_U8 fracPosx; + EB_U8 fracPosy; const EB_COLOR_FORMAT colorFormat = biDst->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 chromaPuWidth = puWidth >> subWidthCMinus1; - EB_U32 chromaPuHeight = puHeight >> subHeightCMinus1; - EB_U32 lumaTempBufSize = puWidth * puHeight; - EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; - - EB_U8 fracPosL0x, fracPosL1x; - EB_U8 fracPosL0y, fracPosL1y; - //compute the luma fractional position - - fracPosL0x = refList0PosX & 0x03; - fracPosL0y = refList0PosY & 0x03; - - - //uni-prediction List1 luma - //compute the luma fractional position - - fracPosL1x = refList1PosX & 0x03; - fracPosL1y = refList1PosY & 0x03; - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly16bit_SSE2( - (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, - fullPelBlockL0->strideY, - (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, - fullPelBlockL1->strideY, - (EB_U16*)biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, - puHeight); - - } - else - { - //List0 luma - //integPosx = (refList0PosX >> 2); - //integPosy = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, - fullPelBlockL0->strideY, - refList0TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - //List1 luma - //integPosx = (refList1PosX >> 2); - //integPosy = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, - fullPelBlockL1->strideY, - refList1TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puWidth, - puHeight, - refList0TempDst, - refList1TempDst, - (EB_U16*)biDst->bufferY + dstLumaIndex, - biDst->strideY); - } - - fracPosL0x = (refList0PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); - fracPosL0y = (refList0PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); - - fracPosL1x = (refList1PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); - fracPosL1y = (refList1PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - - { - BiPredClippingOnTheFly16bit_SSE2( - (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, - fullPelBlockL0->strideCb, - (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, - fullPelBlockL1->strideCb, - (EB_U16*)biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - chromaPuWidth, - chromaPuHeight); - - - BiPredClippingOnTheFly16bit_SSE2( - (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, - fullPelBlockL0->strideCr, - (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, - fullPelBlockL1->strideCr, - (EB_U16*)biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - chromaPuWidth, - chromaPuHeight); - } - } - else - { - //List0 chroma - //integPosx = (refList0PosX >> 3); - //integPosy = (refList0PosY >> 3); - fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, - fullPelBlockL0->strideCb, - refList0TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, - fullPelBlockL0->strideCr, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //*********************** - // L1: Y+Cb+Cr - //*********************** - - //List1 chroma - //integPosx = (refList1PosX >> 3); - //integPosy = (refList1PosY >> 3); - fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, - fullPelBlockL1->strideCb, - refList1TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, - fullPelBlockL1->strideCr, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //*********************** - // L0+L1 - //*********************** - biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize, - refList1TempDst + lumaTempBufSize, - (EB_U16*)biDst->bufferCb + dstChromaIndex, - biDst->strideCb); - - biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - (EB_U16*)biDst->bufferCr + dstChromaIndex, - biDst->strideCr); - - } - - return; + EB_U32 chromaPuWidth = puWidth >> subWidthCMinus1; + EB_U32 chromaPuHeight = puHeight >> subHeightCMinus1; + EB_U32 lumaTempBufSize = puWidth * puHeight; + EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; + + EB_U8 fracPosL0x, fracPosL1x; + EB_U8 fracPosL0y, fracPosL1y; + //compute the luma fractional position + + fracPosL0x = refList0PosX & 0x03; + fracPosL0y = refList0PosY & 0x03; + + + //uni-prediction List1 luma + //compute the luma fractional position + + fracPosL1x = refList1PosX & 0x03; + fracPosL1y = refList1PosY & 0x03; + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly16bit_SSE2( + (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, + fullPelBlockL0->strideY, + (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, + fullPelBlockL1->strideY, + (EB_U16*)biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, + puHeight); + + } + else + { + //List0 luma + //integPosx = (refList0PosX >> 2); + //integPosy = (refList0PosY >> 2); + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, + fullPelBlockL0->strideY, + refList0TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + //List1 luma + //integPosx = (refList1PosX >> 2); + //integPosy = (refList1PosY >> 2); + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, + fullPelBlockL1->strideY, + refList1TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puWidth, + puHeight, + refList0TempDst, + refList1TempDst, + (EB_U16*)biDst->bufferY + dstLumaIndex, + biDst->strideY); + } + + fracPosL0x = (refList0PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); + fracPosL0y = (refList0PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); + + fracPosL1x = (refList1PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); + fracPosL1y = (refList1PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + + { + BiPredClippingOnTheFly16bit_SSE2( + (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, + fullPelBlockL0->strideCb, + (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, + fullPelBlockL1->strideCb, + (EB_U16*)biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + chromaPuWidth, + chromaPuHeight); + + + BiPredClippingOnTheFly16bit_SSE2( + (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, + fullPelBlockL0->strideCr, + (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, + fullPelBlockL1->strideCr, + (EB_U16*)biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + chromaPuWidth, + chromaPuHeight); + } + } + else + { + //List0 chroma + //integPosx = (refList0PosX >> 3); + //integPosy = (refList0PosY >> 3); + fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, + fullPelBlockL0->strideCb, + refList0TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, + fullPelBlockL0->strideCr, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //*********************** + // L1: Y+Cb+Cr + //*********************** + + //List1 chroma + //integPosx = (refList1PosX >> 3); + //integPosy = (refList1PosY >> 3); + fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, + fullPelBlockL1->strideCb, + refList1TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, + fullPelBlockL1->strideCr, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //*********************** + // L0+L1 + //*********************** + biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize, + refList1TempDst + lumaTempBufSize, + (EB_U16*)biDst->bufferCb + dstChromaIndex, + biDst->strideCb); + + biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + (EB_U16*)biDst->bufferCr + dstChromaIndex, + biDst->strideCr); + + } + + return; } /** GeneratePadding() is used to pad the target picture. The horizontal padding happens first and then the vertical padding. @@ -1049,10 +1049,10 @@ void GeneratePadding( { // top part data copy tempSrcPic2 -= srcStride; - EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified // bottom part data copy tempSrcPic3 += srcStride; - EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified --verticalIdx; } @@ -1062,49 +1062,49 @@ void GeneratePadding( is used to pad the target picture. The horizontal padding happens first and then the vertical padding. */ void GeneratePadding16Bit( - EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. - EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. - EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. - EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. - EB_U32 paddingWidth, //input paramter, the padding width. - EB_U32 paddingHeight) //input paramter, the padding height. + EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. + EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. + EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. + EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. + EB_U32 paddingWidth, //input paramter, the padding width. + EB_U32 paddingHeight) //input paramter, the padding height. { - EB_U32 verticalIdx = originalSrcHeight; - EB_BYTE tempSrcPic0; - EB_BYTE tempSrcPic1; - EB_BYTE tempSrcPic2; - EB_BYTE tempSrcPic3; - - tempSrcPic0 = srcPic + paddingWidth + paddingHeight*srcStride; - while (verticalIdx) - { - // horizontal padding - //EB_MEMSET(tempSrcPic0 - paddingWidth, tempSrcPic0, paddingWidth); - memset16bit((EB_U16*)(tempSrcPic0 - paddingWidth), ((EB_U16*)(tempSrcPic0))[0], paddingWidth >> 1); - memset16bit((EB_U16*)(tempSrcPic0 + originalSrcWidth), ((EB_U16*)(tempSrcPic0 + originalSrcWidth - 2/*1*/))[0], paddingWidth >> 1); - - tempSrcPic0 += srcStride; - --verticalIdx; - } - - // vertical padding - verticalIdx = paddingHeight; - tempSrcPic0 = srcPic + paddingHeight*srcStride; - tempSrcPic1 = srcPic + (paddingHeight + originalSrcHeight - 1)*srcStride; - tempSrcPic2 = tempSrcPic0; - tempSrcPic3 = tempSrcPic1; - while (verticalIdx) - { - // top part data copy - tempSrcPic2 -= srcStride; - EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified - // bottom part data copy - tempSrcPic3 += srcStride; - EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified - --verticalIdx; - } - - return; + EB_U32 verticalIdx = originalSrcHeight; + EB_BYTE tempSrcPic0; + EB_BYTE tempSrcPic1; + EB_BYTE tempSrcPic2; + EB_BYTE tempSrcPic3; + + tempSrcPic0 = srcPic + paddingWidth + paddingHeight*srcStride; + while (verticalIdx) + { + // horizontal padding + //EB_MEMSET(tempSrcPic0 - paddingWidth, tempSrcPic0, paddingWidth); + memset16bit((EB_U16*)(tempSrcPic0 - paddingWidth), ((EB_U16*)(tempSrcPic0))[0], paddingWidth >> 1); + memset16bit((EB_U16*)(tempSrcPic0 + originalSrcWidth), ((EB_U16*)(tempSrcPic0 + originalSrcWidth - 2/*1*/))[0], paddingWidth >> 1); + + tempSrcPic0 += srcStride; + --verticalIdx; + } + + // vertical padding + verticalIdx = paddingHeight; + tempSrcPic0 = srcPic + paddingHeight*srcStride; + tempSrcPic1 = srcPic + (paddingHeight + originalSrcHeight - 1)*srcStride; + tempSrcPic2 = tempSrcPic0; + tempSrcPic3 = tempSrcPic1; + while (verticalIdx) + { + // top part data copy + tempSrcPic2 -= srcStride; + EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + // bottom part data copy + tempSrcPic3 += srcStride; + EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + --verticalIdx; + } + + return; } @@ -1112,48 +1112,48 @@ void GeneratePadding16Bit( is used to pad the input picture in order to get . The horizontal padding happens first and then the vertical padding. */ void PadInputPicture( - EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. - EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. - EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. - EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. - EB_U32 padRight, //input paramter, the padding right. - EB_U32 padBottom) //input paramter, the padding bottom. + EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. + EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. + EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. + EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. + EB_U32 padRight, //input paramter, the padding right. + EB_U32 padBottom) //input paramter, the padding bottom. { - EB_U32 verticalIdx; - EB_BYTE tempSrcPic0; - EB_BYTE tempSrcPic1; + EB_U32 verticalIdx; + EB_BYTE tempSrcPic0; + EB_BYTE tempSrcPic1; - if (padRight) { + if (padRight) { - // Add padding @ the right - verticalIdx = originalSrcHeight; - tempSrcPic0 = srcPic; + // Add padding @ the right + verticalIdx = originalSrcHeight; + tempSrcPic0 = srcPic; - while (verticalIdx) - { + while (verticalIdx) + { - EB_MEMSET(tempSrcPic0 + originalSrcWidth, *(tempSrcPic0 + originalSrcWidth - 1), padRight); - tempSrcPic0 += srcStride; - --verticalIdx; - } - } + EB_MEMSET(tempSrcPic0 + originalSrcWidth, *(tempSrcPic0 + originalSrcWidth - 1), padRight); + tempSrcPic0 += srcStride; + --verticalIdx; + } + } - if (padBottom) { + if (padBottom) { - // Add padding @ the bottom - verticalIdx = padBottom; - tempSrcPic0 = srcPic + (originalSrcHeight - 1) * srcStride; - tempSrcPic1 = tempSrcPic0; + // Add padding @ the bottom + verticalIdx = padBottom; + tempSrcPic0 = srcPic + (originalSrcHeight - 1) * srcStride; + tempSrcPic1 = tempSrcPic0; - while (verticalIdx) - { - tempSrcPic1 += srcStride; - EB_MEMCPY(tempSrcPic1, tempSrcPic0, sizeof(EB_U8)* (originalSrcWidth + padRight)); - --verticalIdx; - } - } + while (verticalIdx) + { + tempSrcPic1 += srcStride; + EB_MEMCPY(tempSrcPic1, tempSrcPic0, sizeof(EB_U8)* (originalSrcWidth + padRight)); + --verticalIdx; + } + } - return; + return; } diff --git a/Source/Lib/Codec/EbMcp.h b/Source/Lib/Codec/EbMcp.h index 088d17f3f..fa6df3b8c 100644 --- a/Source/Lib/Codec/EbMcp.h +++ b/Source/Lib/Codec/EbMcp.h @@ -26,11 +26,11 @@ typedef struct MotionCompensationPredictionContext_s EB_S16 *motionCompensationIntermediateResultBuf0; //this 64x64(Y)+32x32(U)+32x32(V) buffer is used to store the MCP intermediate result for ref0. EB_S16 *motionCompensationIntermediateResultBuf1; //this 64x64(Y)+32x32(U)+32x32(V) buffer is used to store the MCP intermediate result for ref1. - EB_BYTE avcStyleMcpIntermediateResultBuf0; // For short filter in MD + EB_BYTE avcStyleMcpIntermediateResultBuf0; // For short filter in MD EB_BYTE avcStyleMcpIntermediateResultBuf1; // For short filter in MD #if !USE_PRE_COMPUTE - EB_S16 *TwoDInterpolationFirstPassFilterResultBuf; //this (64+MaxLumaFliterTag-1)x(64+MaxLumaFliterTag-1) buffer is used to store the result of 1st pass filtering of 2D interpolation filter. + EB_S16 *TwoDInterpolationFirstPassFilterResultBuf; //this (64+MaxLumaFliterTag-1)x(64+MaxLumaFliterTag-1) buffer is used to store the result of 1st pass filtering of 2D interpolation filter. EB_BYTE avcStyleMcpTwoDInterpolationFirstPassFilterResultBuf; // For short filter in MD #endif @@ -41,32 +41,32 @@ typedef struct MotionCompensationPredictionContext_s }MotionCompensationPredictionContext_t; -/** InterpolationFilter() - is generally defined interpolation filter function. - There is a whole group of these functions, each of which corresponds to a particular - integer/fractional sample, and the function is indexed in a function pointer array +/** InterpolationFilter() + is generally defined interpolation filter function. + There is a whole group of these functions, each of which corresponds to a particular + integer/fractional sample, and the function is indexed in a function pointer array in terms of the fracPosx and fracPosy. - + @param *refPic (8-bits input) - refPic is the pointer to the reference picture data that was chosen by + refPic is the pointer to the reference picture data that was chosen by the integer pixel precision MV. @param srcStride (input) @param fracPosx (input) fracPosx is the horizontal fractional position of the predicted sample @param fracPosy (input) - fracPosy is the veritcal fractional position of the predicted sample + fracPosy is the veritcal fractional position of the predicted sample @param puWidth (input) @param puHeight (input) @param *dst (16-bits output) - dst is the pointer to the destination where the prediction result will + dst is the pointer to the destination where the prediction result will be stored. @param dstStride (input) @param *firstPassIFDst (16-bits input) - firstPassIFDst is the pointer to the buffer where the result of the first + firstPassIFDst is the pointer to the buffer where the result of the first pass filtering of the 2D interpolation filter will be stored. @param isLast (input) - isLast indicates if there is any further filtering (interpolation filtering) - afterwards. + isLast indicates if there is any further filtering (interpolation filtering) + afterwards. */ typedef void (*InterpolationFilter)( EB_BYTE refPic, //8-bits input parameter, please refer to the detailed explanation above. @@ -128,12 +128,12 @@ typedef void (*InterpolationFilterOutRaw)( EB_S16 *firstPassIFDst); //input parameter, please refer to the detailed explanation above. typedef void (*InterpolationFilterOutRaw16bit)( - EB_U16 *refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst); + EB_U16 *refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst); typedef void (*ChromaFilterNew)( EB_BYTE refPic, @@ -170,7 +170,7 @@ typedef void (*sampleBiPredClipping16bit)( EB_U32 puHeight, EB_S16 *list0Src, EB_S16 *list1Src, - EB_U16 *dst, + EB_U16 *dst, EB_U32 dstStride); typedef void (*lumaSampleUniPredClipping)( @@ -259,26 +259,26 @@ typedef void (*chromaSampleBiPredAverage)( EB_U32 crDstDoubleStride); extern EB_ERRORTYPE MotionCompensationPredictionContextCtor( - MotionCompensationPredictionContext_t **contextDblPtr, - EB_U16 maxCUWidth, + MotionCompensationPredictionContext_t **contextDblPtr, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit); extern void UniPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPic, - EB_U32 posX, - EB_U32 posY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *tempBuf0, - EB_S16 *tempBuf1, - EB_BOOL is16bit, - EB_U32 componentMask); - -extern void EncodeUniPredInterpolation( + EbPictureBufferDesc_t *refPic, + EB_U32 posX, + EB_U32 posY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *dst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *tempBuf0, + EB_S16 *tempBuf1, + EB_BOOL is16bit, + EB_U32 componentMask); + +extern void EncodeUniPredInterpolation( EbPictureBufferDesc_t *refPic, EB_U32 posX, EB_U32 posY, @@ -300,25 +300,25 @@ void UniPredInterpolation16bit( EbPictureBufferDesc_t *dst, //output parameter, please refer to the detailed explanation above. EB_U32 dstLumaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. - EB_S16 *tempBuf0); //input parameter, please refer to the detailed explanation above. + EB_S16 *tempBuf0); //input parameter, please refer to the detailed explanation above. extern void BiPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPicList0, - EbPictureBufferDesc_t *refPicList1, - EB_U32 refList0PosX, - EB_U32 refList0PosY, - EB_U32 refList1PosX, - EB_U32 refList1PosY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *refList0TempDst, - EB_S16 *refList1TempDst, - EB_S16 *fistPassIFTempDst, - EB_BOOL is16Bit, - EB_U32 componentMask); + EbPictureBufferDesc_t *refPicList0, + EbPictureBufferDesc_t *refPicList1, + EB_U32 refList0PosX, + EB_U32 refList0PosY, + EB_U32 refList1PosX, + EB_U32 refList1PosY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *biDst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *refList0TempDst, + EB_S16 *refList1TempDst, + EB_S16 *fistPassIFTempDst, + EB_BOOL is16Bit, + EB_U32 componentMask); extern void EncodeBiPredInterpolation( EbPictureBufferDesc_t *refPicList0, @@ -338,7 +338,7 @@ extern void EncodeBiPredInterpolation( void BiPredInterpolation16bit( EbPictureBufferDesc_t *fullPelBlockL0, - EbPictureBufferDesc_t *fullPelBlockL1, + EbPictureBufferDesc_t *fullPelBlockL1, EB_U32 refList0PosX, EB_U32 refList0PosY, EB_U32 refList1PosX, @@ -360,19 +360,19 @@ extern void GeneratePadding( EB_U32 paddingWidth, EB_U32 paddingHeight); extern void GeneratePadding16Bit( - EB_BYTE srcPic, - EB_U32 srcStride, - EB_U32 originalSrcWidth, - EB_U32 originalSrcHeight, - EB_U32 paddingWidth, - EB_U32 paddingHeight); + EB_BYTE srcPic, + EB_U32 srcStride, + EB_U32 originalSrcWidth, + EB_U32 originalSrcHeight, + EB_U32 paddingWidth, + EB_U32 paddingHeight); extern void PadInputPicture( EB_BYTE srcPic, EB_U32 srcStride, EB_U32 originalSrcWidth, EB_U32 originalSrcHeight, - EB_U32 padRight, - EB_U32 padBottom); + EB_U32 padRight, + EB_U32 padBottom); void AvcStyleCopy( EB_BYTE refPic, diff --git a/Source/Lib/Codec/EbMcpTables.c b/Source/Lib/Codec/EbMcpTables.c index c6b639870..5508b40ac 100644 --- a/Source/Lib/Codec/EbMcpTables.c +++ b/Source/Lib/Codec/EbMcpTables.c @@ -19,9 +19,9 @@ const sampleBiPredClipping biPredClippingFuncPtrArray[EB_ASM_TYPE_TOTAL] = { }; const sampleBiPredClipping16bit biPredClipping16bitFuncPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT BiPredClipping16bit, - BiPredClipping16bit_SSE2_INTRIN + BiPredClipping16bit_SSE2_INTRIN }; // Luma @@ -48,7 +48,7 @@ const InterpolationFilterNew uniPredLumaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL] // AVX2 { LumaInterpolationCopy_SSSE3, //A - LumaInterpolationFilterPosa_SSSE3, //a + LumaInterpolationFilterPosa_SSSE3, //a LumaInterpolationFilterPosb_SSSE3, //b LumaInterpolationFilterPosc_SSSE3, //c LumaInterpolationFilterPosd_SSSE3, //d @@ -68,9 +68,9 @@ const InterpolationFilterNew uniPredLumaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL] // Luma const InterpolationFilterNew16bit uniPredLuma16bitIFFunctionPtrArray[EB_ASM_TYPE_TOTAL][16] = { //[ASM type][Interpolation position] - // C_DEFAULT - { - LumaInterpolationCopy16bit, //A + // C_DEFAULT + { + LumaInterpolationCopy16bit, //A LumaInterpolationFilterPosaNew16bit, //a LumaInterpolationFilterPosbNew16bit, //b LumaInterpolationFilterPoscNew16bit, //c @@ -86,26 +86,26 @@ const InterpolationFilterNew16bit uniPredLuma16bitIFFunctionPtrArray[EB_ASM_TYPE LumaInterpolationFilterPospNew16bit, //p LumaInterpolationFilterPosqNew16bit, //q LumaInterpolationFilterPosrNew16bit, //r - }, - // AVX2 - { - LumaInterpolationCopy16bit_SSE2, //A - LumaInterpolationFilterPosa16bit_SSE2_INTRIN, //a - LumaInterpolationFilterPosb16bit_SSE2_INTRIN, //b - LumaInterpolationFilterPosc16bit_SSE2_INTRIN, //c - LumaInterpolationFilterPosd16bit_SSE2_INTRIN, //d - LumaInterpolationFilterPose16bit_SSE2_INTRIN, //e - LumaInterpolationFilterPosf16bit_SSE2_INTRIN, //f - LumaInterpolationFilterPosg16bit_SSE2_INTRIN, //g - LumaInterpolationFilterPosh16bit_SSE2_INTRIN, //h - LumaInterpolationFilterPosi16bit_SSE2_INTRIN, //i - LumaInterpolationFilterPosj16bit_SSE2_INTRIN, //j - LumaInterpolationFilterPosk16bit_SSE2_INTRIN, //k - LumaInterpolationFilterPosn16bit_SSE2_INTRIN, //n - LumaInterpolationFilterPosp16bit_SSE2_INTRIN, //p - LumaInterpolationFilterPosq16bit_SSE2_INTRIN, //q - LumaInterpolationFilterPosr16bit_SSE2_INTRIN, //r - }, + }, + // AVX2 + { + LumaInterpolationCopy16bit_SSE2, //A + LumaInterpolationFilterPosa16bit_SSE2_INTRIN, //a + LumaInterpolationFilterPosb16bit_SSE2_INTRIN, //b + LumaInterpolationFilterPosc16bit_SSE2_INTRIN, //c + LumaInterpolationFilterPosd16bit_SSE2_INTRIN, //d + LumaInterpolationFilterPose16bit_SSE2_INTRIN, //e + LumaInterpolationFilterPosf16bit_SSE2_INTRIN, //f + LumaInterpolationFilterPosg16bit_SSE2_INTRIN, //g + LumaInterpolationFilterPosh16bit_SSE2_INTRIN, //h + LumaInterpolationFilterPosi16bit_SSE2_INTRIN, //i + LumaInterpolationFilterPosj16bit_SSE2_INTRIN, //j + LumaInterpolationFilterPosk16bit_SSE2_INTRIN, //k + LumaInterpolationFilterPosn16bit_SSE2_INTRIN, //n + LumaInterpolationFilterPosp16bit_SSE2_INTRIN, //p + LumaInterpolationFilterPosq16bit_SSE2_INTRIN, //q + LumaInterpolationFilterPosr16bit_SSE2_INTRIN, //r + }, }; @@ -151,8 +151,8 @@ const InterpolationFilterOutRaw biPredLumaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTA }; const InterpolationFilterOutRaw16bit biPredLumaIFFunctionPtrArrayNew16bit[EB_ASM_TYPE_TOTAL][16] = { - // C_DEFAULT - { + // C_DEFAULT + { LumaInterpolationCopyOutRaw16bit, //A LumaInterpolationFilterPosaOutRaw16bit, //a LumaInterpolationFilterPosbOutRaw16bit, //b @@ -169,26 +169,26 @@ const InterpolationFilterOutRaw16bit biPredLumaIFFunctionPtrArrayNew16bit[EB_ASM LumaInterpolationFilterPospOutRaw16bit, //p LumaInterpolationFilterPosqOutRaw16bit, //q LumaInterpolationFilterPosrOutRaw16bit, //r - }, - // AVX2 - { - LumaInterpolationCopyOutRaw16bit_SSE2_INTRIN, //A - LumaInterpolationFilterPosaOutRaw16bit_SSE2_INTRIN, //a - LumaInterpolationFilterPosbOutRaw16bit_SSE2_INTRIN, //b - LumaInterpolationFilterPoscOutRaw16bit_SSE2_INTRIN, //c - LumaInterpolationFilterPosdOutRaw16bit_SSE2_INTRIN, //d - LumaInterpolationFilterPoseOutRaw16bit_SSE2_INTRIN, //e - LumaInterpolationFilterPosfOutRaw16bit_SSE2_INTRIN, //f - LumaInterpolationFilterPosgOutRaw16bit_SSE2_INTRIN, //g - LumaInterpolationFilterPoshOutRaw16bit_SSE2_INTRIN, //h - LumaInterpolationFilterPosiOutRaw16bit_SSE2_INTRIN, //i - LumaInterpolationFilterPosjOutRaw16bit_SSE2_INTRIN, //j - LumaInterpolationFilterPoskOutRaw16bit_SSE2_INTRIN, //k - LumaInterpolationFilterPosnOutRaw16bit_SSE2_INTRIN, //n - LumaInterpolationFilterPospOutRaw16bit_SSE2_INTRIN, //p - LumaInterpolationFilterPosqOutRaw16bit_SSE2_INTRIN, //q - LumaInterpolationFilterPosrOutRaw16bit_SSE2_INTRIN, //r - }, + }, + // AVX2 + { + LumaInterpolationCopyOutRaw16bit_SSE2_INTRIN, //A + LumaInterpolationFilterPosaOutRaw16bit_SSE2_INTRIN, //a + LumaInterpolationFilterPosbOutRaw16bit_SSE2_INTRIN, //b + LumaInterpolationFilterPoscOutRaw16bit_SSE2_INTRIN, //c + LumaInterpolationFilterPosdOutRaw16bit_SSE2_INTRIN, //d + LumaInterpolationFilterPoseOutRaw16bit_SSE2_INTRIN, //e + LumaInterpolationFilterPosfOutRaw16bit_SSE2_INTRIN, //f + LumaInterpolationFilterPosgOutRaw16bit_SSE2_INTRIN, //g + LumaInterpolationFilterPoshOutRaw16bit_SSE2_INTRIN, //h + LumaInterpolationFilterPosiOutRaw16bit_SSE2_INTRIN, //i + LumaInterpolationFilterPosjOutRaw16bit_SSE2_INTRIN, //j + LumaInterpolationFilterPoskOutRaw16bit_SSE2_INTRIN, //k + LumaInterpolationFilterPosnOutRaw16bit_SSE2_INTRIN, //n + LumaInterpolationFilterPospOutRaw16bit_SSE2_INTRIN, //p + LumaInterpolationFilterPosqOutRaw16bit_SSE2_INTRIN, //q + LumaInterpolationFilterPosrOutRaw16bit_SSE2_INTRIN, //r + }, }; // Chroma @@ -264,7 +264,7 @@ const ChromaFilterNew uniPredChromaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL][64] { ChromaInterpolationCopy_SSSE3, //B - ChromaInterpolationFilterOneDHorizontal_SSSE3, //ab + ChromaInterpolationFilterOneDHorizontal_SSSE3, //ab ChromaInterpolationFilterOneDHorizontal_SSSE3, //ac ChromaInterpolationFilterOneDHorizontal_SSSE3, //ad ChromaInterpolationFilterOneDHorizontal_SSSE3, //ae @@ -548,20 +548,20 @@ const ChromaFilterOutRaw biPredChromaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL][64 ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3, //ah ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //ba ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bb - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bc - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bd - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //be - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bf - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bg - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bh - ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //ca - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cb - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cc - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cd - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ce - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cf - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cg - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ch + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bc + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bd + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //be + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bf + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bg + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bh + ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //ca + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cb + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cc + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cd + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ce + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cf + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cg + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ch ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //da ChromaInterpolationFilterTwoDOutRaw_SSSE3, //db ChromaInterpolationFilterTwoDOutRaw_SSSE3, //dc diff --git a/Source/Lib/Codec/EbMdRateEstimation.h b/Source/Lib/Codec/EbMdRateEstimation.h index 3062e03a5..4f843a294 100644 --- a/Source/Lib/Codec/EbMdRateEstimation.h +++ b/Source/Lib/Codec/EbMdRateEstimation.h @@ -19,18 +19,18 @@ extern "C" { #define NUMBER_OF_SKIP_FLAG_CASES 6 // number of cases for bit estimation for skip flag -#define NUMBER_OF_MERGE_FLAG_CASES 2 // number of cases for bit estimation for merge flag +#define NUMBER_OF_MERGE_FLAG_CASES 2 // number of cases for bit estimation for merge flag -#define NUMBER_OF_MERGE_INDEX_CASES 5 // number of cases for bit estimation for merge index +#define NUMBER_OF_MERGE_INDEX_CASES 5 // number of cases for bit estimation for merge index #define NUMBER_OF_ALF_CTRL_FLAG_CASES 0 // number of cases for bit estimation for ALF control flag #define NUMBER_OF_INTRA_PART_SIZE_CASES 2 // number of cases for bit estimation for Intra partition size //Note ** to be modified after adding all AMP modes -#define NUMBER_OF_INTER_PART_SIZE_CASES 8 // number of cases for bit estimation for Inter partition size +#define NUMBER_OF_INTER_PART_SIZE_CASES 8 // number of cases for bit estimation for Inter partition size -#define NUMBER_OF_AMP_XPOS_CASES 0 // number of cases for bit estimation for asymmetric motion partition size +#define NUMBER_OF_AMP_XPOS_CASES 0 // number of cases for bit estimation for asymmetric motion partition size #define NUMBER_OF_AMP_YPOS_CASES 0 // number of cases for bit estimation for asymmetric motion partition size @@ -42,7 +42,7 @@ extern "C" { #define NUMBER_OF_INTER_BI_DIR_CASES 8 // number of cases for bit estimation for inter bi-prediction direction : unipred - bipred per depth -#define NUMBER_OF_INTER_UNI_DIR_CASES 2 // number of cases for bit estimation for inter uni-prediction direction : unipred List 0 - unipred List 1 +#define NUMBER_OF_INTER_UNI_DIR_CASES 2 // number of cases for bit estimation for inter uni-prediction direction : unipred List 0 - unipred List 1 #define NUMBER_OF_MVD_CASES 12 // number of cases for bit estimation for motion vector difference @@ -64,7 +64,7 @@ extern "C" { #define NUMBER_OF_LAST_SIG_XY_CASES 0 // number of cases for bit estimation for last significant XY flag -#define TOTAL_NUMBER_OF_LAST_SIG_XY_CASES 0 // total number of cases for bit estimation for luma and chroma +#define TOTAL_NUMBER_OF_LAST_SIG_XY_CASES 0 // total number of cases for bit estimation for luma and chroma #define NUMBER_OF_GREATER_ONE_COEFF_CASES 0 // number of cases for bit estimation for coefficients greater than one @@ -84,7 +84,7 @@ extern "C" { #define NUMBER_OF_SAO_MERGE_FLAG_CASES 2 // number of cases for bit estimation for SAO merge flags -#define NUMBER_OF_SAO_TYPE_INDEX_FLAG_CASES 6 // number of cases for bit estimation for SAO Type +#define NUMBER_OF_SAO_TYPE_INDEX_FLAG_CASES 6 // number of cases for bit estimation for SAO Type #define NUMBER_OF_SAO_OFFSET_TRUNUNARY_CASES 8 // number of cases for bit estimation for SAO Offset trun unary case @@ -144,10 +144,10 @@ typedef struct MdRateEstimationContext_s { EB_BitFraction transSubDivFlagBits [NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES]; EB_BitFraction mergeFlagBits [NUMBER_OF_MERGE_FLAG_CASES]; EB_BitFraction mergeIndexBits [NUMBER_OF_MERGE_INDEX_CASES]; - - EB_BitFraction saoMergeFlagBits [NUMBER_OF_SAO_MERGE_FLAG_CASES]; - EB_BitFraction saoTypeIndexBits [NUMBER_OF_SAO_TYPE_INDEX_FLAG_CASES]; - EB_BitFraction saoOffsetTrunUnaryBits [NUMBER_OF_SAO_OFFSET_TRUNUNARY_CASES]; + + EB_BitFraction saoMergeFlagBits [NUMBER_OF_SAO_MERGE_FLAG_CASES]; + EB_BitFraction saoTypeIndexBits [NUMBER_OF_SAO_TYPE_INDEX_FLAG_CASES]; + EB_BitFraction saoOffsetTrunUnaryBits [NUMBER_OF_SAO_OFFSET_TRUNUNARY_CASES]; EB_BitFraction interBiDirBits [NUMBER_OF_INTER_BI_DIR_CASES]; EB_BitFraction interUniDirBits [NUMBER_OF_INTER_UNI_DIR_CASES]; @@ -210,4 +210,4 @@ extern EB_ERRORTYPE UpdateRateEstimation( } #endif -#endif //EbMdRateEstimationTables_h \ No newline at end of file +#endif //EbMdRateEstimationTables_h diff --git a/Source/Lib/Codec/EbMeSadCalculation.h b/Source/Lib/Codec/EbMeSadCalculation.h index 33d9f9fd0..eaab284fb 100644 --- a/Source/Lib/Codec/EbMeSadCalculation.h +++ b/Source/Lib/Codec/EbMeSadCalculation.h @@ -38,10 +38,10 @@ typedef void(*EB_SADCALCULATION32X32AND64X64_TYPE)( EB_U32 mv); typedef void(*EB_INIALIZEBUFFER_32BITS)( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value); + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value); typedef void(*EB_RECTAMPSADCALCULATION8X8AND16X16_TYPE)( EB_U8 *src, @@ -107,14 +107,14 @@ static EB_SADCALCULATION8X8AND16X16_TYPE SadCalculation_8x8_16x16_funcPtrArray[E // C_DEFAULT SadCalculation_8x8_16x16, // AVX2 - SadCalculation_8x8_16x16_SSE2_INTRIN, + SadCalculation_8x8_16x16_SSE2_INTRIN, }; static EB_SADCALCULATION32X32AND64X64_TYPE SadCalculation_32x32_64x64_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT SadCalculation_32x32_64x64, - // AVX2 - SadCalculation_32x32_64x64_SSE2_INTRIN, + // AVX2 + SadCalculation_32x32_64x64_SSE2_INTRIN, }; @@ -128,5 +128,5 @@ static EB_INIALIZEBUFFER_32BITS InitializeBuffer_32bits_funcPtrArray[EB_ASM_TYPE #ifdef __cplusplus } -#endif -#endif // EbMeSadCalculation_h \ No newline at end of file +#endif +#endif // EbMeSadCalculation_h diff --git a/Source/Lib/Codec/EbModeDecision.c b/Source/Lib/Codec/EbModeDecision.c index b2f436a9e..b9f32ba4c 100644 --- a/Source/Lib/Codec/EbModeDecision.c +++ b/Source/Lib/Codec/EbModeDecision.c @@ -28,13 +28,13 @@ EB_INTRA_MODE_2, EB_INTRA_MODE_6, EB_INTRA_MODE_14, EB_INTRA_MODE_18, EB_INTRA_M EB_BOOL AntiContouringIntraModeValidityPerDepth[35] = { - EB_TRUE, EB_TRUE, + EB_TRUE, EB_TRUE, + EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, - EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE @@ -68,13 +68,13 @@ EB_U8 GetNumOfIntraModesFromOisPoint( ); extern EB_U32 stage1ModesArray[]; -void intraSearchTheseModesOutputBest( +void intraSearchTheseModesOutputBest( ModeDecisionContext_t *contextPtr, PictureControlSet_t *pictureControlSetPtr, EB_U8 *src, EB_U32 srcStride, - EB_U8 NumOfModesToTest, - EB_U32 *bestMode, + EB_U8 NumOfModesToTest, + EB_U32 *bestMode, EB_U32 *bestSADOut ) { @@ -82,9 +82,9 @@ void intraSearchTheseModesOutputBest( EB_U32 candidateIndex; EB_U32 mode; EB_U32 bestSAD = 32 * 32 * 255; - EB_U32 sadCurr; + EB_U32 sadCurr; + - for (candidateIndex = 0; candidateIndex < NumOfModesToTest; candidateIndex++) { mode = stage1ModesArray[candidateIndex]; @@ -92,7 +92,7 @@ void intraSearchTheseModesOutputBest( // Intra Prediction IntraPredOnSrc( contextPtr, - PICTURE_BUFFER_DESC_LUMA_MASK, + PICTURE_BUFFER_DESC_LUMA_MASK, pictureControlSetPtr, contextPtr->predictionBuffer, mode); @@ -124,96 +124,96 @@ void intraSearchTheseModesOutputBest( * Mode Decision Candidate Ctor ***************************************/ EB_ERRORTYPE ModeDecisionCandidateBufferCtor( - ModeDecisionCandidateBuffer_t **bufferDblPtr, - EB_U16 lcuMaxSize, - EB_BITDEPTH maxBitdepth, - EB_U64 *fastCostPtr, - EB_U64 *fullCostPtr, - EB_U64 *fullCostSkipPtr, - EB_U64 *fullCostMergePtr) + ModeDecisionCandidateBuffer_t **bufferDblPtr, + EB_U16 lcuMaxSize, + EB_BITDEPTH maxBitdepth, + EB_U64 *fastCostPtr, + EB_U64 *fullCostPtr, + EB_U64 *fullCostSkipPtr, + EB_U64 *fullCostMergePtr) { - EbPictureBufferDescInitData_t pictureBufferDescInitData; - EbPictureBufferDescInitData_t doubleWidthPictureBufferDescInitData; - EB_ERRORTYPE return_error = EB_ErrorNone; - // Allocate Buffer - ModeDecisionCandidateBuffer_t *bufferPtr; - EB_MALLOC(ModeDecisionCandidateBuffer_t*, bufferPtr, sizeof(ModeDecisionCandidateBuffer_t), EB_N_PTR); - *bufferDblPtr = bufferPtr; - - // Init Picture Data - pictureBufferDescInitData.maxWidth = lcuMaxSize; - pictureBufferDescInitData.maxHeight = lcuMaxSize; - pictureBufferDescInitData.bitDepth = maxBitdepth; - pictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; + EbPictureBufferDescInitData_t pictureBufferDescInitData; + EbPictureBufferDescInitData_t doubleWidthPictureBufferDescInitData; + EB_ERRORTYPE return_error = EB_ErrorNone; + // Allocate Buffer + ModeDecisionCandidateBuffer_t *bufferPtr; + EB_MALLOC(ModeDecisionCandidateBuffer_t*, bufferPtr, sizeof(ModeDecisionCandidateBuffer_t), EB_N_PTR); + *bufferDblPtr = bufferPtr; + + // Init Picture Data + pictureBufferDescInitData.maxWidth = lcuMaxSize; + pictureBufferDescInitData.maxHeight = lcuMaxSize; + pictureBufferDescInitData.bitDepth = maxBitdepth; + pictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; pictureBufferDescInitData.colorFormat = EB_YUV420; - pictureBufferDescInitData.leftPadding = 0; - pictureBufferDescInitData.rightPadding = 0; - pictureBufferDescInitData.topPadding = 0; - pictureBufferDescInitData.botPadding = 0; - pictureBufferDescInitData.splitMode = EB_FALSE; - - doubleWidthPictureBufferDescInitData.maxWidth = lcuMaxSize; - doubleWidthPictureBufferDescInitData.maxHeight = lcuMaxSize; - doubleWidthPictureBufferDescInitData.bitDepth = EB_16BIT; - doubleWidthPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; + pictureBufferDescInitData.leftPadding = 0; + pictureBufferDescInitData.rightPadding = 0; + pictureBufferDescInitData.topPadding = 0; + pictureBufferDescInitData.botPadding = 0; + pictureBufferDescInitData.splitMode = EB_FALSE; + + doubleWidthPictureBufferDescInitData.maxWidth = lcuMaxSize; + doubleWidthPictureBufferDescInitData.maxHeight = lcuMaxSize; + doubleWidthPictureBufferDescInitData.bitDepth = EB_16BIT; + doubleWidthPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; doubleWidthPictureBufferDescInitData.colorFormat = EB_YUV420; - doubleWidthPictureBufferDescInitData.leftPadding = 0; - doubleWidthPictureBufferDescInitData.rightPadding = 0; - doubleWidthPictureBufferDescInitData.topPadding = 0; - doubleWidthPictureBufferDescInitData.botPadding = 0; - doubleWidthPictureBufferDescInitData.splitMode = EB_FALSE; - - // Candidate Ptr - bufferPtr->candidatePtr = (ModeDecisionCandidate_t*)EB_NULL; - - // Video Buffers - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->predictionPtr), - (EB_PTR)&pictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->residualQuantCoeffPtr), - (EB_PTR)&doubleWidthPictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->reconCoeffPtr), - (EB_PTR)&doubleWidthPictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->reconPtr), - (EB_PTR)&pictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - //Distortion - bufferPtr->residualLumaSad = 0; - - bufferPtr->fullLambdaRate = 0; - - - // Costs - bufferPtr->fastCostPtr = fastCostPtr; - bufferPtr->fullCostPtr = fullCostPtr; - bufferPtr->fullCostSkipPtr = fullCostSkipPtr; - bufferPtr->fullCostMergePtr = fullCostMergePtr; - return EB_ErrorNone; + doubleWidthPictureBufferDescInitData.leftPadding = 0; + doubleWidthPictureBufferDescInitData.rightPadding = 0; + doubleWidthPictureBufferDescInitData.topPadding = 0; + doubleWidthPictureBufferDescInitData.botPadding = 0; + doubleWidthPictureBufferDescInitData.splitMode = EB_FALSE; + + // Candidate Ptr + bufferPtr->candidatePtr = (ModeDecisionCandidate_t*)EB_NULL; + + // Video Buffers + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->predictionPtr), + (EB_PTR)&pictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->residualQuantCoeffPtr), + (EB_PTR)&doubleWidthPictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->reconCoeffPtr), + (EB_PTR)&doubleWidthPictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->reconPtr), + (EB_PTR)&pictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + //Distortion + bufferPtr->residualLumaSad = 0; + + bufferPtr->fullLambdaRate = 0; + + + // Costs + bufferPtr->fastCostPtr = fastCostPtr; + bufferPtr->fullCostPtr = fullCostPtr; + bufferPtr->fullCostSkipPtr = fullCostSkipPtr; + bufferPtr->fullCostMergePtr = fullCostMergePtr; + return EB_ErrorNone; } // Function Declarations void RoundMv( - ModeDecisionCandidate_t *candidateArray, + ModeDecisionCandidate_t *candidateArray, EB_U32 canTotalCnt) { @@ -313,26 +313,26 @@ EB_ERRORTYPE SetMvpClipMVs( * do full reconstruction on. ***************************************/ EB_ERRORTYPE PreModeDecision( - CodingUnit_t *cuPtr, - EB_U32 bufferTotalCount, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 *fullCandidateTotalCountPtr, - EB_U8 *bestCandidateIndexArray, - EB_U8 *disableMergeIndex, + CodingUnit_t *cuPtr, + EB_U32 bufferTotalCount, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 *fullCandidateTotalCountPtr, + EB_U8 *bestCandidateIndexArray, + EB_U8 *disableMergeIndex, EB_BOOL sameFastFullCandidate ) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 fullCandidateIndex; - EB_U32 fullReconCandidateCount; - EB_U32 highestCostIndex; - EB_U64 highestCost; - EB_U32 candIndx = 0, i, j, index; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 fullCandidateIndex; + EB_U32 fullReconCandidateCount; + EB_U32 highestCostIndex; + EB_U64 highestCost; + EB_U32 candIndx = 0, i, j, index; - *fullCandidateTotalCountPtr = bufferTotalCount; + *fullCandidateTotalCountPtr = bufferTotalCount; - //Second, We substract one, because with N buffers we can determine the best N-1 candidates. - //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough + //Second, We substract one, because with N buffers we can determine the best N-1 candidates. + //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough if (sameFastFullCandidate){ fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr)); } @@ -340,11 +340,11 @@ EB_ERRORTYPE PreModeDecision( fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr) - 1); } - //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. - highestCost = *(bufferPtrArray[0]->fastCostPtr); - highestCostIndex = 0; + //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. + highestCost = *(bufferPtrArray[0]->fastCostPtr); + highestCostIndex = 0; - if (bufferTotalCount > 1){ + if (bufferTotalCount > 1){ if (sameFastFullCandidate){ for (i = 0; i < bufferTotalCount; i++) { bestCandidateIndexArray[candIndx++] = (EB_U8)i; @@ -366,35 +366,35 @@ EB_ERRORTYPE PreModeDecision( } } - } - else - bestCandidateIndexArray[0] = 0; - for(i = 0; i < fullReconCandidateCount - 1; ++i) { - for (j = i + 1; j < fullReconCandidateCount; ++j) { - if ((bufferPtrArray[bestCandidateIndexArray[i]]->candidatePtr->type == INTRA_MODE) && - (bufferPtrArray[bestCandidateIndexArray[j]]->candidatePtr->type == INTER_MODE)){ - index = bestCandidateIndexArray[i]; - bestCandidateIndexArray[i] = (EB_U8)bestCandidateIndexArray[j]; - bestCandidateIndexArray[j] = (EB_U8)index; - } - } - } - - // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount - (*fullCandidateTotalCountPtr) = fullReconCandidateCount; - - for (i = 0; i < fullReconCandidateCount; ++i) { - fullCandidateIndex = bestCandidateIndexArray[i]; - - // Next, Set the transformSize - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, GetCodedUnitStats(cuPtr->leafIndex)->size)); - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize >> 1)); + } + else + bestCandidateIndexArray[0] = 0; + for(i = 0; i < fullReconCandidateCount - 1; ++i) { + for (j = i + 1; j < fullReconCandidateCount; ++j) { + if ((bufferPtrArray[bestCandidateIndexArray[i]]->candidatePtr->type == INTRA_MODE) && + (bufferPtrArray[bestCandidateIndexArray[j]]->candidatePtr->type == INTER_MODE)){ + index = bestCandidateIndexArray[i]; + bestCandidateIndexArray[i] = (EB_U8)bestCandidateIndexArray[j]; + bestCandidateIndexArray[j] = (EB_U8)index; + } + } + } + + // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount + (*fullCandidateTotalCountPtr) = fullReconCandidateCount; + + for (i = 0; i < fullReconCandidateCount; ++i) { + fullCandidateIndex = bestCandidateIndexArray[i]; + + // Next, Set the transformSize + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, GetCodedUnitStats(cuPtr->leafIndex)->size)); + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize >> 1)); // Set disableMergeIndex - *disableMergeIndex = bufferPtrArray[fullCandidateIndex]->candidatePtr->type == INTER_MODE ? 1 : *disableMergeIndex; - } + *disableMergeIndex = bufferPtrArray[fullCandidateIndex]->candidatePtr->type == INTER_MODE ? 1 : *disableMergeIndex; + } - return return_error; + return return_error; } static void LimitMvOverBound( @@ -425,7 +425,7 @@ static void LimitMvOverBound( // Horizontal if (((mvxF % 4) != 0) && (cuOriginX + mvxF + cuSize > (endX - pad) || (cuOriginX + mvxF < (startX + pad)))) { - //half/quarter interpolation, and cross the boundary, clamp to integer first + //half/quarter interpolation, and cross the boundary, clamp to integer first mvxF = ((mvxF >> 2) << 2); } @@ -469,18 +469,18 @@ void Me2Nx2NCandidatesInjection( EB_U32 canTotalCnt = (*candidateTotalCnt); const EB_U32 lcuAddr = lcuPtr->index; const EB_U32 cuOriginX = contextPtr->cuOriginX; - const EB_U32 cuOriginY = contextPtr->cuOriginY; + const EB_U32 cuOriginY = contextPtr->cuOriginY; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - const EB_U32 meTotalCnt = mePuResult->totalMeCandidateIndex; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + const EB_U32 meTotalCnt = mePuResult->totalMeCandidateIndex; - for (meCandidateIndex = 0; meCandidateIndex < meTotalCnt; ++meCandidateIndex) - { + for (meCandidateIndex = 0; meCandidateIndex < meTotalCnt; ++meCandidateIndex) + { - const EB_U32 interDirection = mePuResult->distortionDirection[meCandidateIndex].direction; + const EB_U32 interDirection = mePuResult->distortionDirection[meCandidateIndex].direction; if (interDirection == BI_PRED && pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuPtr->index] == LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE) continue; candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; @@ -524,7 +524,7 @@ void Me2Nx2NCandidatesInjection( } } - candidateArray[canTotalCnt].meDistortion = mePuResult->distortionDirection[meCandidateIndex].distortion; + candidateArray[canTotalCnt].meDistortion = mePuResult->distortionDirection[meCandidateIndex].distortion; candidateArray[canTotalCnt].distortionReady = 1; @@ -540,7 +540,7 @@ void Me2Nx2NCandidatesInjection( cuOriginX, cuOriginY, 0, - sequenceControlSetPtr->lcuSize, + sequenceControlSetPtr->lcuSize, pictureControlSetPtr ); @@ -585,7 +585,7 @@ void Amvp2Nx2NCandidatesInjection( EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] ) { - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; @@ -759,43 +759,43 @@ EB_S8 BIPRED_3x3_X_POS[BIPRED_3x3_REFINMENT_POSITIONS] = {-1, -1, 0, 1, 1, 1, EB_S8 BIPRED_3x3_Y_POS[BIPRED_3x3_REFINMENT_POSITIONS] = { 0, 1, 1, 1, 0, -1, -1, -1}; void Unipred3x3CandidatesInjection( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, - const SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, - const EB_U32 me2Nx2NTableOffset, - EB_U32 *candidateTotalCnt, - EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], - EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, + const SequenceControlSet_t *sequenceControlSetPtr, + LargestCodingUnit_t *lcuPtr, + const EB_U32 me2Nx2NTableOffset, + EB_U32 *candidateTotalCnt, + EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], + EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] ) { - EB_U32 bipredIndex; - EB_U32 canTotalCnt = (*candidateTotalCnt); + EB_U32 bipredIndex; + EB_U32 canTotalCnt = (*candidateTotalCnt); EB_BOOL mvOutOfPicFlag = EB_FALSE; - const EB_U32 lcuAddr = lcuPtr->index; - const EB_U32 cuOriginX = contextPtr->cuOriginX; - const EB_U32 cuOriginY = contextPtr->cuOriginY; + const EB_U32 lcuAddr = lcuPtr->index; + const EB_U32 cuOriginX = contextPtr->cuOriginX; + const EB_U32 cuOriginY = contextPtr->cuOriginY; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - // (Best_L0, 8 Best_L1 neighbors) - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { + // (Best_L0, 8 Best_L1 neighbors) + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { - const EB_U32 interDirection = UNI_PRED_LIST_1; + const EB_U32 interDirection = UNI_PRED_LIST_1; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + BIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + BIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + BIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + BIPRED_3x3_Y_POS[bipredIndex]; - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -812,62 +812,62 @@ void Unipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // (8 Best_L0 neighbors, Best_L1) : - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { - - const EB_U32 interDirection = UNI_PRED_LIST_0; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + BIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + BIPRED_3x3_Y_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; - - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // (8 Best_L0 neighbors, Best_L1) : + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { + + const EB_U32 interDirection = UNI_PRED_LIST_0; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + BIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + BIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; + + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -884,95 +884,95 @@ void Unipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // update the total number of candidates injected - (*candidateTotalCnt) = canTotalCnt; - - - return; + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // update the total number of candidates injected + (*candidateTotalCnt) = canTotalCnt; + + + return; } void Bipred3x3CandidatesInjection( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, - const SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, - const EB_U32 me2Nx2NTableOffset, - EB_U32 *candidateTotalCnt, - EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], - EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, + const SequenceControlSet_t *sequenceControlSetPtr, + LargestCodingUnit_t *lcuPtr, + const EB_U32 me2Nx2NTableOffset, + EB_U32 *candidateTotalCnt, + EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], + EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] ) { - EB_U32 bipredIndex; - EB_U32 canTotalCnt = (*candidateTotalCnt); + EB_U32 bipredIndex; + EB_U32 canTotalCnt = (*candidateTotalCnt); EB_BOOL mvOutOfPicFlag = EB_FALSE; - const EB_U32 lcuAddr = lcuPtr->index; - const EB_U32 cuOriginX = contextPtr->cuOriginX; - const EB_U32 cuOriginY = contextPtr->cuOriginY; + const EB_U32 lcuAddr = lcuPtr->index; + const EB_U32 cuOriginX = contextPtr->cuOriginX; + const EB_U32 cuOriginY = contextPtr->cuOriginY; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - // (Best_L0, 8 Best_L1 neighbors) - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { + // (Best_L0, 8 Best_L1 neighbors) + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { - const EB_U32 interDirection = BI_PRED; + const EB_U32 interDirection = BI_PRED; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + BIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + BIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + BIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + BIPRED_3x3_Y_POS[bipredIndex]; - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -989,63 +989,63 @@ void Bipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // (8 Best_L0 neighbors, Best_L1) : - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { - - const EB_U32 interDirection = BI_PRED; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + BIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + BIPRED_3x3_Y_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; - - - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // (8 Best_L0 neighbors, Best_L1) : + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { + + const EB_U32 interDirection = BI_PRED; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + BIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + BIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; + + + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -1062,52 +1062,52 @@ void Bipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // update the total number of candidates injected - (*candidateTotalCnt) = canTotalCnt; - - return; + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // update the total number of candidates injected + (*candidateTotalCnt) = canTotalCnt; + + return; } @@ -1132,8 +1132,8 @@ void ProductIntraCandidateInjection( const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; if (contextPtr->intraInjectionMethod == 2) { EB_U8 totModes = MAX_INTRA_MODES; @@ -1151,7 +1151,7 @@ void ProductIntraCandidateInjection( const EB_BOOL limitIntra = contextPtr->limitIntra; const EB_U8 limitLeftMode = cuSize < 32 ? EB_INTRA_MODE_27 : EB_INTRA_VERTICAL; const EB_U8 limitTopMode = cuSize < 32 ? EB_INTRA_MODE_9 : EB_INTRA_HORIZONTAL; - + EB_BOOL skipOis8x8 = (pictureControlSetPtr->ParentPcsPtr->skipOis8x8 && cuSize == 8); if (pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuPtr->index] == LCU_COMPLEXITY_STATUS_2) { @@ -1188,13 +1188,13 @@ void ProductIntraCandidateInjection( if (cuSize > 8) { const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; } else { - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; oisCandidate = oisCu8ResultsPtr->sortedOisCandidate[contextPtr->cuStats->cuNumInDepth]; totalIntraLumaMode = oisCu8ResultsPtr->totalIntraLumaMode[contextPtr->cuStats->cuNumInDepth]; } @@ -1217,12 +1217,12 @@ void ProductIntraCandidateInjection( } } else { - // No Intra 64x64 + // No Intra 64x64 if (cuDepth != 0) { //---------------------- // I Slice - //---------------------- + //---------------------- if (sliceType == EB_I_PICTURE) { if (cuSize == 32) { @@ -1253,7 +1253,7 @@ void ProductIntraCandidateInjection( else if (cuSize == 16) { const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; const EB_U32 totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; @@ -1291,7 +1291,7 @@ void ProductIntraCandidateInjection( } else { - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu8ResultsPtr->sortedOisCandidate[contextPtr->cuStats->cuNumInDepth]; const EB_U32 totalIntraLumaMode = oisCu8ResultsPtr->totalIntraLumaMode[contextPtr->cuStats->cuNumInDepth]; @@ -1321,18 +1321,18 @@ void ProductIntraCandidateInjection( //---------------------- // P/B Slice - //---------------------- + //---------------------- else { if ((cuSize >= 16 && pictureControlSetPtr->ParentPcsPtr->cu16x16Mode == CU_16x16_MODE_0 && pictureControlSetPtr->encMode < ENC_MODE_11) - || (cuSize == 32)) + || (cuSize == 32)) { { if (pictureControlSetPtr->ParentPcsPtr->limitOisToDcModeFlag) { const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; const OisCandidate_t *oisCandidate = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]->sortedOisCandidate[me2Nx2NTableOffset]; - EB_U32 bestSAD; + EB_U32 bestSAD; EB_U32 bestAngMode = 0; EB_U8 numOfModesToSearch = GetNumOfIntraModesFromOisPoint( @@ -1400,7 +1400,7 @@ void ProductIntraCandidateInjection( const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; const EB_U32 totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; @@ -1428,21 +1428,21 @@ void ProductIntraCandidateInjection( } } - else if (cuSize == 16) { - if (limitIntra == 0 || (isLeftCu == 0 && isTopCu == 0)) - { - candidateArray[canTotalCnt].type = INTRA_MODE; - candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_DC; - candidateArray[canTotalCnt].distortionReady = 0; - canTotalCnt++; - - candidateArray[canTotalCnt].type = INTRA_MODE; - candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_PLANAR; - candidateArray[canTotalCnt].distortionReady = 0; - canTotalCnt++; - } + else if (cuSize == 16) { + if (limitIntra == 0 || (isLeftCu == 0 && isTopCu == 0)) + { + candidateArray[canTotalCnt].type = INTRA_MODE; + candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_DC; + candidateArray[canTotalCnt].distortionReady = 0; + canTotalCnt++; + + candidateArray[canTotalCnt].type = INTRA_MODE; + candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_PLANAR; + candidateArray[canTotalCnt].distortionReady = 0; + canTotalCnt++; + } - } + } else if (pictureControlSetPtr->ParentPcsPtr->cu8x8Mode == CU_8x8_MODE_1) { @@ -1461,7 +1461,7 @@ void ProductIntraCandidateInjection( if (lcuParams->isCompleteLcu) { const CodedUnitStats_t *cuStats = GetCodedUnitStats(parentIndex[leafIndex]); const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; const EB_U32 totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; @@ -1507,7 +1507,7 @@ void ProductIntraCandidateInjection( } } else { - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu8ResultsPtr->sortedOisCandidate[contextPtr->cuStats->cuNumInDepth]; const EB_U32 totalIntraLumaMode = oisCu8ResultsPtr->totalIntraLumaMode[contextPtr->cuStats->cuNumInDepth]; @@ -1618,7 +1618,7 @@ static EB_BOOL CheckForMvOverBound( static void ProductMergeSkip2Nx2NCandidatesInjection( ModeDecisionContext_t *contextPtr, const SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, + LargestCodingUnit_t *lcuPtr, InterPredictionContext_t *interPredictionPtr, EB_U32 *candidateTotalCnt, EB_U32 mvMergeCandidateTotalCount @@ -1630,7 +1630,7 @@ static void ProductMergeSkip2Nx2NCandidatesInjection( EB_U32 duplicateIndex; EB_BOOL mvMergeDuplicateFlag = EB_FALSE; EB_BOOL mvOutOfPicFlag = EB_FALSE; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; while (mvMergeCandidateTotalCount) { @@ -1713,18 +1713,18 @@ static void ProductMergeSkip2Nx2NCandidatesInjection( void ProductMpmCandidatesInjection( ModeDecisionContext_t *contextPtr, EB_U32 *candidateTotalCnt, - EB_U32 *bufferTotalCountPtr, - EB_BOOL mpmSearch, - EB_U8 mpmSearchCandidate, - EB_U32 *mostProbableModeArray + EB_U32 *bufferTotalCountPtr, + EB_BOOL mpmSearch, + EB_U8 mpmSearchCandidate, + EB_U32 *mostProbableModeArray ) { const EB_U32 cuDepth = contextPtr->cuStats->depth; EB_U32 canTotalCnt = (*candidateTotalCnt); - EB_U32 fastLoopCandidate = 0; - EB_U32 candidateIndex; - EB_U32 mostProbableModeCount; + EB_U32 fastLoopCandidate = 0; + EB_U32 candidateIndex; + EB_U32 mostProbableModeCount; EB_BOOL mpmPresentFlag; #ifdef LIMITINRA_MPM_PATCH @@ -1736,7 +1736,7 @@ void ProductMpmCandidatesInjection( const EB_U8 limitTopMode = cuSize < 32 ? EB_INTRA_MODE_9 : EB_INTRA_HORIZONTAL; #endif - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; if (mpmSearch && cuDepth != 0){ @@ -1803,46 +1803,46 @@ void ProductMpmCandidatesInjection( * perform fast cost search on. ***************************************/ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( - LargestCodingUnit_t *lcuPtr, - ModeDecisionContext_t *contextPtr, - const EB_U32 leafIndex, - const EB_U32 lcuAddr, - EB_U32 *bufferTotalCountPtr, - EB_U32 *candidateTotalCountPtr, - EB_PTR interPredContextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL mpmSearch, - EB_U8 mpmSearchCandidate, - EB_U32 *mostProbableModeArray) + LargestCodingUnit_t *lcuPtr, + ModeDecisionContext_t *contextPtr, + const EB_U32 leafIndex, + const EB_U32 lcuAddr, + EB_U32 *bufferTotalCountPtr, + EB_U32 *candidateTotalCountPtr, + EB_PTR interPredContextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL mpmSearch, + EB_U8 mpmSearchCandidate, + EB_U32 *mostProbableModeArray) { - InterPredictionContext_t *interPredictionPtr = (InterPredictionContext_t*)interPredContextPtr; - const SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - // const LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuAddr]; - const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + InterPredictionContext_t *interPredictionPtr = (InterPredictionContext_t*)interPredContextPtr; + const SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + // const LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuAddr]; + const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - EB_U32 fullReconSearchCount = contextPtr->fullReconSearchCount; - // AMVP + EB_U32 fullReconSearchCount = contextPtr->fullReconSearchCount; + // AMVP EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2] ; - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ; - EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST]; - const EB_U32 cuNumberInDepth = contextPtr->cuStats->cuNumInDepth; + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ; + EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST]; + const EB_U32 cuNumberInDepth = contextPtr->cuStats->cuNumInDepth; const EB_U32 cuDepth = contextPtr->cuStats->depth; - const EB_U32 me2Nx2NTableOffset = cuNumberInDepth + me2Nx2NOffset[cuDepth]; - EB_U32 mvMergeCandidateTotalCount = contextPtr->mvMergeSkipModeCount; - EB_S16 amvpArray_x[MAX_NUM_OF_REF_PIC_LIST][2]; - EB_S16 amvpArray_y[MAX_NUM_OF_REF_PIC_LIST][2]; - EB_U32 canTotalCnt = 0; + const EB_U32 me2Nx2NTableOffset = cuNumberInDepth + me2Nx2NOffset[cuDepth]; + EB_U32 mvMergeCandidateTotalCount = contextPtr->mvMergeSkipModeCount; + EB_S16 amvpArray_x[MAX_NUM_OF_REF_PIC_LIST][2]; + EB_S16 amvpArray_y[MAX_NUM_OF_REF_PIC_LIST][2]; + EB_U32 canTotalCnt = 0; - //---------------------- - // Intra - //---------------------- + //---------------------- + // Intra + //---------------------- if (cuDepth != 0 && (sliceType == EB_I_PICTURE || cuDepth == 3 || contextPtr->restrictIntraGlobalMotion == EB_FALSE)) { - const EB_BOOL isLeftCu = contextPtr->cuStats->originX == 0; - const EB_BOOL isTopCu = contextPtr->cuStats->originY == 0; - EB_BOOL limitIntraLoptLeft = contextPtr->limitIntra == EB_TRUE && isLeftCu && isTopCu; - if (limitIntraLoptLeft == 0) + const EB_BOOL isLeftCu = contextPtr->cuStats->originX == 0; + const EB_BOOL isTopCu = contextPtr->cuStats->originY == 0; + EB_BOOL limitIntraLoptLeft = contextPtr->limitIntra == EB_TRUE && isLeftCu && isTopCu; + if (limitIntraLoptLeft == 0) ProductIntraCandidateInjection( // HT not much to do pictureControlSetPtr, @@ -1850,8 +1850,8 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( sequenceControlSetPtr, lcuPtr, &canTotalCnt, - leafIndex - ); + leafIndex + ); } if (sliceType != EB_I_PICTURE) @@ -1886,7 +1886,7 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( //---------------------- // Me2Nx2N - //---------------------- + //---------------------- Me2Nx2NCandidatesInjection( // HT not much to do pictureControlSetPtr, contextPtr, @@ -1898,26 +1898,26 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( firstPuAMVPCandArray_y, firstPuNumAvailableAMVPCand); - if (contextPtr->amvpInjection) { - - //---------------------- - // Amvp2Nx2N - //---------------------- - Amvp2Nx2NCandidatesInjection( - pictureControlSetPtr, - contextPtr, - sequenceControlSetPtr, - &canTotalCnt, - firstPuAMVPCandArray_x, - firstPuAMVPCandArray_y, - firstPuNumAvailableAMVPCand); - } - + if (contextPtr->amvpInjection) { + + //---------------------- + // Amvp2Nx2N + //---------------------- + Amvp2Nx2NCandidatesInjection( + pictureControlSetPtr, + contextPtr, + sequenceControlSetPtr, + &canTotalCnt, + firstPuAMVPCandArray_x, + firstPuAMVPCandArray_y, + firstPuNumAvailableAMVPCand); + } + if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { if (contextPtr->bipred3x3Injection) { //---------------------- // Bipred2Nx2N - //---------------------- + //---------------------- Bipred3x3CandidatesInjection( // HT not much to do pictureControlSetPtr, @@ -1934,7 +1934,7 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( if (contextPtr->unipred3x3Injection) { //---------------------- // Unipred2Nx2N - //---------------------- + //---------------------- Unipred3x3CandidatesInjection( // HT not much to do pictureControlSetPtr, contextPtr, @@ -1948,38 +1948,38 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( } } - //---------------------- - // MergeSkip2Nx2N - //---------------------- - if (mvMergeCandidateTotalCount) { - ProductMergeSkip2Nx2NCandidatesInjection( // HT not much to do - contextPtr, - sequenceControlSetPtr, + //---------------------- + // MergeSkip2Nx2N + //---------------------- + if (mvMergeCandidateTotalCount) { + ProductMergeSkip2Nx2NCandidatesInjection( // HT not much to do + contextPtr, + sequenceControlSetPtr, lcuPtr, - interPredictionPtr, - &canTotalCnt, - mvMergeCandidateTotalCount); - } + interPredictionPtr, + &canTotalCnt, + mvMergeCandidateTotalCount); + } - } + } - // Set BufferTotalCount: determines the number of candidates to fully reconstruct - *bufferTotalCountPtr = fullReconSearchCount; + // Set BufferTotalCount: determines the number of candidates to fully reconstruct + *bufferTotalCountPtr = fullReconSearchCount; - // Mark MPM candidates, and update the number of full recon - MPM candidates are going to get pushed to the full, - // however they still need to be tested in the fast loop where the predicted, and the fast rate are going to get computed + // Mark MPM candidates, and update the number of full recon - MPM candidates are going to get pushed to the full, + // however they still need to be tested in the fast loop where the predicted, and the fast rate are going to get computed #ifdef LIMITINRA_MPM_PATCH const EB_BOOL isLeftCu = contextPtr->cuStats->originX == 0; const EB_BOOL isTopCu = contextPtr->cuStats->originY == 0; EB_BOOL limitIntraLoptLeft = contextPtr->limitIntra == EB_TRUE && isLeftCu && isTopCu; if (limitIntraLoptLeft == 0) - ProductMpmCandidatesInjection( - contextPtr, - &canTotalCnt, - bufferTotalCountPtr, - mpmSearch, - mpmSearchCandidate, - mostProbableModeArray); + ProductMpmCandidatesInjection( + contextPtr, + &canTotalCnt, + bufferTotalCountPtr, + mpmSearch, + mpmSearchCandidate, + mostProbableModeArray); #else ProductMpmCandidatesInjection( @@ -1991,12 +1991,12 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( mostProbableModeArray); #endif - *candidateTotalCountPtr = canTotalCnt; + *candidateTotalCountPtr = canTotalCnt; - // Make sure bufferTotalCount is not larger than the number of fast modes - *bufferTotalCountPtr = MIN(*candidateTotalCountPtr, *bufferTotalCountPtr); + // Make sure bufferTotalCount is not larger than the number of fast modes + *bufferTotalCountPtr = MIN(*candidateTotalCountPtr, *bufferTotalCountPtr); - return EB_ErrorNone; + return EB_ErrorNone; } /*************************************** @@ -2004,193 +2004,193 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( ***************************************/ EB_U8 ProductFullModeDecision( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - EB_U8 cuSize, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 candidateTotalCount, - EB_U8 *bestCandidateIndexArray, - EB_U32 *bestIntraMode) + CodingUnit_t *cuPtr, + EB_U8 cuSize, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 candidateTotalCount, + EB_U8 *bestCandidateIndexArray, + EB_U32 *bestIntraMode) { - EB_U8 candidateIndex; - EB_U64 lowestCost = 0xFFFFFFFFFFFFFFFFull; - EB_U64 lowestIntraCost = 0xFFFFFFFFFFFFFFFFull; - EB_U8 lowestCostIndex = 0; - PredictionUnit_t *puPtr; + EB_U8 candidateIndex; + EB_U64 lowestCost = 0xFFFFFFFFFFFFFFFFull; + EB_U64 lowestIntraCost = 0xFFFFFFFFFFFFFFFFull; + EB_U8 lowestCostIndex = 0; + PredictionUnit_t *puPtr; EB_U32 i; - ModeDecisionCandidate_t *candidatePtr; + ModeDecisionCandidate_t *candidatePtr; + + lowestCostIndex = bestCandidateIndexArray[0]; - lowestCostIndex = bestCandidateIndexArray[0]; + // Find the candidate with the lowest cost + for (i = 0; i < candidateTotalCount; ++i) { - // Find the candidate with the lowest cost - for (i = 0; i < candidateTotalCount; ++i) { + candidateIndex = bestCandidateIndexArray[i]; - candidateIndex = bestCandidateIndexArray[i]; - - // Compute fullCostBis + // Compute fullCostBis if (( *(bufferPtrArray[candidateIndex]->fullCostPtr) < lowestIntraCost) && bufferPtrArray[candidateIndex]->candidatePtr->type == INTRA_MODE){ - *bestIntraMode = bufferPtrArray[candidateIndex]->candidatePtr->intraLumaMode; - lowestIntraCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); + *bestIntraMode = bufferPtrArray[candidateIndex]->candidatePtr->intraLumaMode; + lowestIntraCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); - } + } - if ( *(bufferPtrArray[candidateIndex]->fullCostPtr) < lowestCost){ - lowestCostIndex = candidateIndex; - lowestCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); - } + if ( *(bufferPtrArray[candidateIndex]->fullCostPtr) < lowestCost){ + lowestCostIndex = candidateIndex; + lowestCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); + } - } + } - candidatePtr = bufferPtrArray[lowestCostIndex]->candidatePtr; + candidatePtr = bufferPtrArray[lowestCostIndex]->candidatePtr; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *(bufferPtrArray[lowestCostIndex]->fullCostPtr); - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion) + bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *(bufferPtrArray[lowestCostIndex]->fullCostPtr); + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion) + bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; if(candidatePtr->type==INTRA_MODE) - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma = bufferPtrArray[lowestCostIndex]->fullCostLuma; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *bufferPtrArray[lowestCostIndex]->fullCostMergePtr; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *bufferPtrArray[lowestCostIndex]->fullCostSkipPtr; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma = bufferPtrArray[lowestCostIndex]->fullCostLuma; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *bufferPtrArray[lowestCostIndex]->fullCostMergePtr; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *bufferPtrArray[lowestCostIndex]->fullCostSkipPtr; if(candidatePtr->type == INTER_MODE && candidatePtr->mergeFlag == EB_TRUE){ contextPtr->mdEpPipeLcu[cuPtr->leafIndex].chromaDistortion = bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion; } - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = bufferPtrArray[lowestCostIndex]->candidatePtr->fullDistortion; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortion = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortionInterDepth = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; - cuPtr->predictionModeFlag = candidatePtr->type; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = bufferPtrArray[lowestCostIndex]->candidatePtr->fullDistortion; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortion = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortionInterDepth = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; + cuPtr->predictionModeFlag = candidatePtr->type; cuPtr->skipFlag = candidatePtr->skipFlag; // note, the skip flag is re-checked in the ENCDEC process cuPtr->rootCbf = ((candidatePtr->rootCbf) > 0) ? EB_TRUE : EB_FALSE; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].countNonZeroCoeffs = candidatePtr->countNonZeroCoeffs; - // Set the PU level variables - - { - puPtr = cuPtr->predictionUnitArray; - // Intra Prediction - puPtr->intraLumaMode = 0x1F; - if (cuPtr->predictionModeFlag == INTRA_MODE) - { - puPtr->intraLumaMode = candidatePtr->intraLumaMode; - } - - // Inter Prediction - puPtr->interPredDirectionIndex = candidatePtr->predictionDirection[0]; - puPtr->mergeFlag = candidatePtr->mergeFlag; - if (cuPtr->predictionModeFlag != INTER_MODE) - { - puPtr->interPredDirectionIndex = 0x03; - puPtr->mergeFlag = EB_FALSE; - } - puPtr->mergeIndex = candidatePtr->mergeIndex; - puPtr->mv[REF_LIST_0].x = 0; - puPtr->mv[REF_LIST_0].y = 0; - - puPtr->mv[REF_LIST_1].x = 0; - puPtr->mv[REF_LIST_1].y = 0; - - if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_0) - { - //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVsL0,4); - puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; - puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; - } - - if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) - { - //EB_MEMCPY(&puPtr->mv[REF_LIST_1].x,&candidatePtr->MVsL1,4); - puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; - puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; - } - - if (puPtr->interPredDirectionIndex == BI_PRED) - { - //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVs,8); - puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; - puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; - puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; - puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; - } + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].countNonZeroCoeffs = candidatePtr->countNonZeroCoeffs; + // Set the PU level variables + + { + puPtr = cuPtr->predictionUnitArray; + // Intra Prediction + puPtr->intraLumaMode = 0x1F; + if (cuPtr->predictionModeFlag == INTRA_MODE) + { + puPtr->intraLumaMode = candidatePtr->intraLumaMode; + } + + // Inter Prediction + puPtr->interPredDirectionIndex = candidatePtr->predictionDirection[0]; + puPtr->mergeFlag = candidatePtr->mergeFlag; + if (cuPtr->predictionModeFlag != INTER_MODE) + { + puPtr->interPredDirectionIndex = 0x03; + puPtr->mergeFlag = EB_FALSE; + } + puPtr->mergeIndex = candidatePtr->mergeIndex; + puPtr->mv[REF_LIST_0].x = 0; + puPtr->mv[REF_LIST_0].y = 0; + + puPtr->mv[REF_LIST_1].x = 0; + puPtr->mv[REF_LIST_1].y = 0; + + if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_0) + { + //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVsL0,4); + puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; + puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; + } + + if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) + { + //EB_MEMCPY(&puPtr->mv[REF_LIST_1].x,&candidatePtr->MVsL1,4); + puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; + puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; + } + + if (puPtr->interPredDirectionIndex == BI_PRED) + { + //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVs,8); + puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; + puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; + puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; + puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; + } // The MV prediction indicies are recalcated by the EncDec. puPtr->mvd[REF_LIST_0].predIdx = 0; puPtr->mvd[REF_LIST_1].predIdx = 0; - } + } TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStatPtr; - EB_U32 tuItr; - EB_U32 tuSize; - EB_U32 tuIndex; + const TransformUnitStats_t *tuStatPtr; + EB_U32 tuItr; + EB_U32 tuSize; + EB_U32 tuIndex; - EB_U32 parentTuIndex; + EB_U32 parentTuIndex; - EB_U32 tuTotalCount; + EB_U32 tuTotalCount; EB_U32 cuSizeLog2 = contextPtr->cuSizeLog2; if (cuSize == MAX_LCU_SIZE){ - tuTotalCount = 4; - tuIndex = 1; - tuItr = 0; - tuPtr = &cuPtr->transformUnitArray[0]; - tuPtr->splitFlag = EB_TRUE; - tuPtr->cbCbf = EB_FALSE; - tuPtr->crCbf = EB_FALSE; - - // Set TU variables + tuTotalCount = 4; + tuIndex = 1; + tuItr = 0; + tuPtr = &cuPtr->transformUnitArray[0]; + tuPtr->splitFlag = EB_TRUE; + tuPtr->cbCbf = EB_FALSE; + tuPtr->crCbf = EB_FALSE; + + // Set TU variables + tuPtr->cbCbf2 = EB_FALSE; + tuPtr->crCbf2 = EB_FALSE; + tuPtr->chromaCbfContext = 0; //at TU level + } + else { + tuTotalCount = 1; + tuIndex = 0; + tuItr = 0; + } + + //cuPtr->forceSmallTu = candidatePtr->forceSmallTu; + + // Set TU + do { + tuStatPtr = GetTransformUnitStats(tuIndex); + tuSize = cuSize >> tuStatPtr->depth; + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + parentTuIndex = 0; + if (tuStatPtr->depth > 0) + parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; + + tuPtr->splitFlag = EB_FALSE; + tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); + tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); + tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); tuPtr->cbCbf2 = EB_FALSE; tuPtr->crCbf2 = EB_FALSE; - tuPtr->chromaCbfContext = 0; //at TU level - } - else { - tuTotalCount = 1; - tuIndex = 0; - tuItr = 0; - } - - //cuPtr->forceSmallTu = candidatePtr->forceSmallTu; - - // Set TU - do { - tuStatPtr = GetTransformUnitStats(tuIndex); - tuSize = cuSize >> tuStatPtr->depth; - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - parentTuIndex = 0; - if (tuStatPtr->depth > 0) - parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; - - tuPtr->splitFlag = EB_FALSE; - tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); - tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); - tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); - tuPtr->cbCbf2 = EB_FALSE; - tuPtr->crCbf2 = EB_FALSE; - - //CHKN tuPtr->chromaCbfContext = (tuIndex == 0 || (cuPtr->partitionMode == SIZE_NxN)) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level - tuPtr->chromaCbfContext = (tuIndex == 0 || (0)) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level - + + //CHKN tuPtr->chromaCbfContext = (tuIndex == 0 || (cuPtr->partitionMode == SIZE_NxN)) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level + tuPtr->chromaCbfContext = (tuIndex == 0 || (0)) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level + tuPtr->lumaCbfContext = (cuSizeLog2 - Log2f(tuSize)) == 0 ? 1 : 0; - if (tuPtr->cbCbf){ - cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; - } - if (tuPtr->crCbf){ - cuPtr->transformUnitArray[0].crCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; - } + if (tuPtr->cbCbf){ + cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; + } + if (tuPtr->crCbf){ + cuPtr->transformUnitArray[0].crCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; + } - ++tuItr; - tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + ++tuItr; + tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; - } while (tuItr < tuTotalCount); + } while (tuItr < tuTotalCount); - return lowestCostIndex; + return lowestCostIndex; } diff --git a/Source/Lib/Codec/EbModeDecision.h b/Source/Lib/Codec/EbModeDecision.h index d4bd0d364..8e9df3c2c 100644 --- a/Source/Lib/Codec/EbModeDecision.h +++ b/Source/Lib/Codec/EbModeDecision.h @@ -22,87 +22,87 @@ extern "C" { #endif #define ENABLE_AMVP_MV_FOR_RC_PU 0 -#define MAX_MPM_CANDIDATES 3 +#define MAX_MPM_CANDIDATES 3 - static const EB_U32 tuIndexList[3][16] = - { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 }, - { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 } - }; + static const EB_U32 tuIndexList[3][16] = + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 }, + { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 } + }; #define MERGE_PENALTY 10 - // Create incomplete struct definition for the following function pointer typedefs - struct ModeDecisionCandidateBuffer_s; - struct ModeDecisionContext_s; + // Create incomplete struct definition for the following function pointer typedefs + struct ModeDecisionCandidateBuffer_s; + struct ModeDecisionContext_s; - /************************************** - * Function Ptrs Definitions - **************************************/ + /************************************** + * Function Ptrs Definitions + **************************************/ typedef EB_ERRORTYPE(*EB_PREDICTION_FUNC)( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr); - typedef EB_ERRORTYPE(*EB_FAST_COST_FUNC)( + typedef EB_ERRORTYPE(*EB_FAST_COST_FUNC)( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); - - typedef EB_ERRORTYPE(*EB_FULL_COST_FUNC)( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); - - typedef EB_ERRORTYPE(*EB_FULL_LUMA_COST_FUNC)( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize); - - /************************************** - * Mode Decision Candidate - **************************************/ - typedef struct ModeDecisionCandidate_s - { - // *Warning - this struct has been organized to be cache efficient when being - // constructured in the function GenerateAmvpMergeInterIntraMdCandidatesCU. - // Changing the ordering could affect performance - - union { - struct { - unsigned meDistortion : 20; - unsigned distortionReady : 1; - unsigned : 3; - unsigned intraLumaMode : 8; - }; - EB_U32 oisResults; - }; + CodingUnit_t *cuPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); + + typedef EB_ERRORTYPE(*EB_FULL_COST_FUNC)( + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr); + + typedef EB_ERRORTYPE(*EB_FULL_LUMA_COST_FUNC)( + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize); + + /************************************** + * Mode Decision Candidate + **************************************/ + typedef struct ModeDecisionCandidate_s + { + // *Warning - this struct has been organized to be cache efficient when being + // constructured in the function GenerateAmvpMergeInterIntraMdCandidatesCU. + // Changing the ordering could affect performance + + union { + struct { + unsigned meDistortion : 20; + unsigned distortionReady : 1; + unsigned : 3; + unsigned intraLumaMode : 8; + }; + EB_U32 oisResults; + }; union { struct{ union { @@ -125,211 +125,211 @@ typedef EB_ERRORTYPE(*EB_PREDICTION_FUNC)( EB_U64 MVs; }; - EB_U8 skipFlag; - EB_BOOL mergeFlag; - EB_U8 mergeIndex; + EB_U8 skipFlag; + EB_BOOL mergeFlag; + EB_U8 mergeIndex; EB_U16 countNonZeroCoeffs; - EB_BOOL predictionIsReady; - EB_BOOL predictionIsReadyLuma; - EB_U8 type; - EB_BOOL mpmFlag; - - // MD Rate Estimation Ptr - MdRateEstimationContext_t *mdRateEstimationPtr; // 64 bits - EB_U64 fastLumaRate; - EB_U64 fastChromaRate; - EB_U64 chromaDistortion; - EB_U64 chromaDistortionInterDepth; - EB_U32 lumaDistortion; - EB_U32 fullDistortion; - EB_U32 fastLoopLumaDistortion; - - // Function Pointers - EB_PTR predictionContextPtr; - EB_FAST_COST_FUNC fastCostFuncPtr; - EB_FULL_COST_FUNC fullCostFuncPtr; - EB_FULL_LUMA_COST_FUNC fullLumaCostFuncPtr; - EB_PREDDIRECTION predictionDirection[MAX_NUM_OF_PU_PER_CU]; // 2 bits - - - EB_S16 motionVectorPred_x[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits - EB_S16 motionVectorPred_y[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits - EB_U8 motionVectorPredIdx[MAX_NUM_OF_REF_PIC_LIST]; // 2 bits - EB_U8 transformSize; // 8 bit - EB_U8 transformChromaSize; // 8 bit - EB_U8 rootCbf; // ?? bit - determine empirically - EB_U8 cbCbf; // ?? bit - EB_U8 crCbf; // ?? bit + EB_BOOL predictionIsReady; + EB_BOOL predictionIsReadyLuma; + EB_U8 type; + EB_BOOL mpmFlag; + + // MD Rate Estimation Ptr + MdRateEstimationContext_t *mdRateEstimationPtr; // 64 bits + EB_U64 fastLumaRate; + EB_U64 fastChromaRate; + EB_U64 chromaDistortion; + EB_U64 chromaDistortionInterDepth; + EB_U32 lumaDistortion; + EB_U32 fullDistortion; + EB_U32 fastLoopLumaDistortion; + + // Function Pointers + EB_PTR predictionContextPtr; + EB_FAST_COST_FUNC fastCostFuncPtr; + EB_FULL_COST_FUNC fullCostFuncPtr; + EB_FULL_LUMA_COST_FUNC fullLumaCostFuncPtr; + EB_PREDDIRECTION predictionDirection[MAX_NUM_OF_PU_PER_CU]; // 2 bits + + + EB_S16 motionVectorPred_x[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits + EB_S16 motionVectorPred_y[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits + EB_U8 motionVectorPredIdx[MAX_NUM_OF_REF_PIC_LIST]; // 2 bits + EB_U8 transformSize; // 8 bit + EB_U8 transformChromaSize; // 8 bit + EB_U8 rootCbf; // ?? bit - determine empirically + EB_U8 cbCbf; // ?? bit + EB_U8 crCbf; // ?? bit EB_U32 yCbf; // Issue, should be less than 32 - - } ModeDecisionCandidate_t; - /************************************** - * Mode Decision Candidate Buffer - **************************************/ - typedef struct IntraChromaCandidateBuffer_s { - EB_U32 mode; - EB_U64 cost; - EB_U64 distortion; + } ModeDecisionCandidate_t; + + /************************************** + * Mode Decision Candidate Buffer + **************************************/ + typedef struct IntraChromaCandidateBuffer_s { + EB_U32 mode; + EB_U64 cost; + EB_U64 distortion; - EbPictureBufferDesc_t *predictionPtr; - EbPictureBufferDesc_t *residualPtr; + EbPictureBufferDesc_t *predictionPtr; + EbPictureBufferDesc_t *residualPtr; - } IntraChromaCandidateBuffer_t; + } IntraChromaCandidateBuffer_t; - /************************************** - * Mode Decision Candidate Buffer - **************************************/ - typedef struct ModeDecisionCandidateBuffer_s { - // Candidate Ptr - ModeDecisionCandidate_t *candidatePtr; + /************************************** + * Mode Decision Candidate Buffer + **************************************/ + typedef struct ModeDecisionCandidateBuffer_s { + // Candidate Ptr + ModeDecisionCandidate_t *candidatePtr; - // Video Buffers - EbPictureBufferDesc_t *predictionPtr; - EbPictureBufferDesc_t *residualQuantCoeffPtr;// One buffer for residual and quantized coefficient - EbPictureBufferDesc_t *reconCoeffPtr; + // Video Buffers + EbPictureBufferDesc_t *predictionPtr; + EbPictureBufferDesc_t *residualQuantCoeffPtr;// One buffer for residual and quantized coefficient + EbPictureBufferDesc_t *reconCoeffPtr; - // *Note - We should be able to combine the reconCoeffPtr & reconPtr pictures (they aren't needed at the same time) - EbPictureBufferDesc_t *reconPtr; + // *Note - We should be able to combine the reconCoeffPtr & reconPtr pictures (they aren't needed at the same time) + EbPictureBufferDesc_t *reconPtr; - // Distortion (SAD) - EB_U64 residualLumaSad; + // Distortion (SAD) + EB_U64 residualLumaSad; - EB_U64 fullLambdaRate; + EB_U64 fullLambdaRate; EB_U64 fullCostLuma; - // Costs - EB_U64 *fastCostPtr; - EB_U64 *fullCostPtr; - EB_U64 fullCostPlusCuBoundDist; // fullCostPlusCuBoundDist= fullCost + CU boundaries distortion if derived otherwise fullCostPlusCuBoundDist = fullCost - - EB_U64 *fullCostSkipPtr; - EB_U64 *fullCostMergePtr; - // - EB_U64 cbCoeffBits; - EB_U64 cbDistortion[2]; - EB_U64 crCoeffBits; - EB_U64 crDistortion[2]; - EB_U64 fullCostNoAc; - CoeffCtxtMdl_t candBuffCoeffCtxModel; + // Costs + EB_U64 *fastCostPtr; + EB_U64 *fullCostPtr; + EB_U64 fullCostPlusCuBoundDist; // fullCostPlusCuBoundDist= fullCost + CU boundaries distortion if derived otherwise fullCostPlusCuBoundDist = fullCost + + EB_U64 *fullCostSkipPtr; + EB_U64 *fullCostMergePtr; + // + EB_U64 cbCoeffBits; + EB_U64 cbDistortion[2]; + EB_U64 crCoeffBits; + EB_U64 crDistortion[2]; + EB_U64 fullCostNoAc; + CoeffCtxtMdl_t candBuffCoeffCtxModel; EB_BOOL weightChromaDistortion; EB_U64 yFullDistortion[DIST_CALC_TOTAL]; - EB_U64 yCoeffBits; - EB_S16 yDc[4];// Store the ABS of DC values per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 + EB_U64 yCoeffBits; + EB_S16 yDc[4];// Store the ABS of DC values per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 EB_U16 yCountNonZeroCoeffs[4];// Store nonzero CoeffNum, per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 - } ModeDecisionCandidateBuffer_t; + } ModeDecisionCandidateBuffer_t; - /************************************** - * Extern Function Declarations - **************************************/ + /************************************** + * Extern Function Declarations + **************************************/ extern EB_ERRORTYPE ModeDecisionCandidateBufferCtor( - ModeDecisionCandidateBuffer_t **bufferDblPtr, - EB_U16 lcuMaxSize, - EB_BITDEPTH maxBitdepth, - EB_U64 *fastCostPtr, - EB_U64 *fullCostPtr, - EB_U64 *fullCostSkipPtr, - EB_U64 *fullCostMergePtr); + ModeDecisionCandidateBuffer_t **bufferDblPtr, + EB_U16 lcuMaxSize, + EB_BITDEPTH maxBitdepth, + EB_U64 *fastCostPtr, + EB_U64 *fullCostPtr, + EB_U64 *fullCostSkipPtr, + EB_U64 *fullCostMergePtr); EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( - LargestCodingUnit_t *lcuPtr, - struct ModeDecisionContext_s *contextPtr, - const EB_U32 leafIndex, - - const EB_U32 lcuAddr, - EB_U32 *bufferTotalCount, - EB_U32 *fastCandidateTotalCount, - EB_PTR interPredContextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL mpmSearch, - EB_U8 mpmSearchCandidate, - EB_U32 *mostProbableModeArray); - - EB_U8 FullModeDecision( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 candidateTotalCount, - EB_U8 *bestCandidateIndexArray, - EB_BOOL syntaxCabacUpdate, - EB_U32 *bestIntraMode); - - - EB_U8 ProductFullModeDecision( + LargestCodingUnit_t *lcuPtr, struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - EB_U8 cuSize, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 candidateTotalCount, - EB_U8 *bestCandidateIndexArray, - EB_U32 *bestIntraMode); - - EB_ERRORTYPE PreModeDecision( - CodingUnit_t *cuPtr, - EB_U32 bufferTotalCount, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 *fullCandidateTotalCountPtr, - EB_U8 *bestCandidateIndexArray, - EB_U8 *disableMergeIndex, + const EB_U32 leafIndex, + + const EB_U32 lcuAddr, + EB_U32 *bufferTotalCount, + EB_U32 *fastCandidateTotalCount, + EB_PTR interPredContextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL mpmSearch, + EB_U8 mpmSearchCandidate, + EB_U32 *mostProbableModeArray); + + EB_U8 FullModeDecision( + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 candidateTotalCount, + EB_U8 *bestCandidateIndexArray, + EB_BOOL syntaxCabacUpdate, + EB_U32 *bestIntraMode); + + + EB_U8 ProductFullModeDecision( + struct ModeDecisionContext_s *contextPtr, + CodingUnit_t *cuPtr, + EB_U8 cuSize, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 candidateTotalCount, + EB_U8 *bestCandidateIndexArray, + EB_U32 *bestIntraMode); + + EB_ERRORTYPE PreModeDecision( + CodingUnit_t *cuPtr, + EB_U32 bufferTotalCount, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 *fullCandidateTotalCountPtr, + EB_U8 *bestCandidateIndexArray, + EB_U8 *disableMergeIndex, EB_BOOL sameFastFullCandidate); - typedef EB_ERRORTYPE(*EB_INTRA_4x4_FAST_LUMA_COST_FUNC)( - struct ModeDecisionContext_s *contextPtr, - EB_U32 puIndex, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 lumaDistortion, - EB_U64 lambda); - - typedef EB_ERRORTYPE(*EB_INTRA_4x4_FULL_LUMA_COST_FUNC)( - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize); - - typedef EB_ERRORTYPE(*EB_INTRA_NxN_FAST_COST_FUNC)( - CodingUnit_t *cuPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + typedef EB_ERRORTYPE(*EB_INTRA_4x4_FAST_LUMA_COST_FUNC)( + struct ModeDecisionContext_s *contextPtr, + EB_U32 puIndex, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U64 lumaDistortion, + EB_U64 lambda); + + typedef EB_ERRORTYPE(*EB_INTRA_4x4_FULL_LUMA_COST_FUNC)( + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize); + + typedef EB_ERRORTYPE(*EB_INTRA_NxN_FAST_COST_FUNC)( + CodingUnit_t *cuPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); typedef EB_ERRORTYPE(*EB_INTRA_NxN_FULL_COST_FUNC)( - PictureControlSet_t *pictureControlSetPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); - - - typedef EB_ERRORTYPE(*EB_FULL_NXN_COST_FUNC)( - PictureControlSet_t *pictureControlSetPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); - - struct CodingLoopContext_s; + PictureControlSet_t *pictureControlSetPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); + + + typedef EB_ERRORTYPE(*EB_FULL_NXN_COST_FUNC)( + PictureControlSet_t *pictureControlSetPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); + + struct CodingLoopContext_s; #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbModeDecisionConfiguration.c b/Source/Lib/Codec/EbModeDecisionConfiguration.c index a9b5c5f71..dbf4c03fb 100644 --- a/Source/Lib/Codec/EbModeDecisionConfiguration.c +++ b/Source/Lib/Codec/EbModeDecisionConfiguration.c @@ -100,7 +100,7 @@ EB_ERRORTYPE MdcRefinement( } if (refinementLevel & REFINEMENT_Pp1){ - + if (depth < 3 && cuIndex < 81){ localCuArray[cuIndex + 1].slectedCu = EB_TRUE; localCuArray[cuIndex + 1 + DepthOffset[depth + 1]].slectedCu = EB_TRUE; @@ -108,7 +108,7 @@ EB_ERRORTYPE MdcRefinement( localCuArray[cuIndex + 1 + 3 * DepthOffset[depth + 1]].slectedCu = EB_TRUE; } if (lowestLevel == REFINEMENT_Pp1){ - if (depth < 3 && cuIndex < 81){ + if (depth < 3 && cuIndex < 81){ localCuArray[cuIndex + 1].stopSplit = EB_TRUE; localCuArray[cuIndex + 1 + DepthOffset[depth + 1]].stopSplit = EB_TRUE; localCuArray[cuIndex + 1 + 2 * DepthOffset[depth + 1]].stopSplit = EB_TRUE; @@ -265,7 +265,7 @@ EB_ERRORTYPE MdcIntraCuRate( EB_U64 chromaRate; EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - + CHECK_REPORT_ERROR( (partitionMode == SIZE_2Nx2N), encodeContextPtr->appCallbackPtr, @@ -325,7 +325,7 @@ EB_U64 MdcInterCuRate( // Estimate the Motion Vector Prediction Index Bits rate += 23196; - // Estimate the Motion Vector Difference Bits + // Estimate the Motion Vector Difference Bits MVs_0 = ABS(xMvL0); MVs_1 = ABS(yMvL0); MVs_0 = MVs_0 > 499 ? 499 : MVs_0; @@ -338,7 +338,7 @@ EB_U64 MdcInterCuRate( // Estimate the Motion Vector Prediction Index Bits rate += 23196; - // Estimate the Motion Vector Difference Bits + // Estimate the Motion Vector Difference Bits MVs_2 = ABS(xMvL1); MVs_3 = ABS(yMvL1); @@ -360,7 +360,7 @@ EB_U64 MdcInterCuRate( rate += 46392; - // Estimate the Motion Vector Difference Bits + // Estimate the Motion Vector Difference Bits MVs_0 = ABS(xMvL0); MVs_1 = ABS(yMvL0); @@ -370,7 +370,7 @@ EB_U64 MdcInterCuRate( rate += mvBitTable[MVs_0][MVs_1]; - // Estimate the Motion Vector Difference Bits + // Estimate the Motion Vector Difference Bits MVs_2 = ABS(xMvL1); MVs_3 = ABS(yMvL1); MVs_2 = MVs_2 > 499 ? 499 : MVs_2; @@ -463,7 +463,7 @@ void RefinementPredictionLoop( EB_U8 lowestLevel = 0x00; if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) - refinementLevel = NdpRefinementControl_ISLICE[depth]; + refinementLevel = NdpRefinementControl_ISLICE[depth]; else refinementLevel = NdpRefinementControl_ISLICE_Sub4K[depth]; @@ -490,16 +490,16 @@ void RefinementPredictionLoop( if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_PRED_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE)) { refinementLevel = Pred; } - else - - if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_OPEN_LOOP_DEPTH_MODE || + else + + if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_OPEN_LOOP_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_OPEN_LOOP_DEPTH_MODE)) refinementLevel = NdpRefinementControlNREF[temporalLayerIndex][depth]; else refinementLevel = NdpRefinementControl_FAST[temporalLayerIndex][depth]; - if (pictureControlSetPtr->ParentPcsPtr->cu8x8Mode == CU_8x8_MODE_1) { + if (pictureControlSetPtr->ParentPcsPtr->cu8x8Mode == CU_8x8_MODE_1) { refinementLevel = ((refinementLevel & REFINEMENT_Pp1) && depth == 2) ? refinementLevel - REFINEMENT_Pp1 : ((refinementLevel & REFINEMENT_Pp2) && depth == 1) ? refinementLevel - REFINEMENT_Pp2 : ((refinementLevel & REFINEMENT_Pp3) && depth == 0) ? refinementLevel - REFINEMENT_Pp3 : refinementLevel; @@ -568,7 +568,7 @@ void PrePredictionRefinement( } - // S-LOGO + // S-LOGO if (stationaryEdgeOverTimeFlag > 0){ @@ -650,7 +650,7 @@ void ForwardCuToModeDecision( } - // Take into account MAX CU size & MAX intra size (from the API) + // Take into account MAX CU size & MAX intra size (from the API) cuClass = (cuStatsPtr->size > MAX_CU_SIZE || (sliceType == EB_I_PICTURE && cuStatsPtr->size > MAX_INTRA_SIZE)) ? DO_NOT_ADD_CU_CONTINUE_SPLIT : cuClass; @@ -845,7 +845,7 @@ void MdcInterDepthDecision( } } - // Stage 2: Inter depth decision: depth 0 vs depth 1 + // Stage 2: Inter depth decision: depth 0 vs depth 1 // Walks to the last coded 32x32 block for merging // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates @@ -912,7 +912,7 @@ void PredictionPartitionLoop( ) { - MdRateEstimationContext_t *mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; + MdRateEstimationContext_t *mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; MdcpLocalCodingUnit_t *localCuArray = contextPtr->localCuArray; MdcpLocalCodingUnit_t *cuPtr; @@ -962,46 +962,46 @@ void PredictionPartitionLoop( &cuIntraRate); - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuIndex]; - OisCandidate_t * oisCuPtr = cuIndexInRaterScan < RASTER_SCAN_CU_INDEX_8x8_0 ? - oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan] : oisCu8ResultsPtr->sortedOisCandidate[cuIndexInRaterScan - RASTER_SCAN_CU_INDEX_8x8_0]; - - - if (size > 32){ - cuIntraSad = - oisCu32Cu16ResultsPtr->sortedOisCandidate[1][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[2][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[3][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[4][0].distortion; - } - else if (size == 32) { - cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; - } - else{ - if (size > 8){ - cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; - } - else{ - if (oisCuPtr[0].validDistortion){ - cuIntraSad = oisCuPtr[0].distortion; - } - else{ - - const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); - const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; - - - if (oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ - cuIntraSad = oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else { - cuIntraSad = 0; - } - } - } - } - + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuIndex]; + OisCandidate_t * oisCuPtr = cuIndexInRaterScan < RASTER_SCAN_CU_INDEX_8x8_0 ? + oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan] : oisCu8ResultsPtr->sortedOisCandidate[cuIndexInRaterScan - RASTER_SCAN_CU_INDEX_8x8_0]; + + + if (size > 32){ + cuIntraSad = + oisCu32Cu16ResultsPtr->sortedOisCandidate[1][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[2][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[3][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[4][0].distortion; + } + else if (size == 32) { + cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; + } + else{ + if (size > 8){ + cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; + } + else{ + if (oisCuPtr[0].validDistortion){ + cuIntraSad = oisCuPtr[0].distortion; + } + else{ + + const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); + const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; + + + if (oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ + cuIntraSad = oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else { + cuIntraSad = 0; + } + } + } + } + cuIntraCost = (cuIntraSad << COST_PRECISION) + ((contextPtr->lambda * cuIntraRate + MD_OFFSET) >> MD_SHIFT); cuPtr->earlyCost = cuIntraCost; @@ -1010,16 +1010,16 @@ void PredictionPartitionLoop( if (pictureControlSetPtr->sliceType != EB_I_PICTURE){ - - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexInRaterScan]; - cuInterRate = MdcInterCuRate( - mePuResult->distortionDirection[0].direction, - mePuResult->xMvL0, - mePuResult->yMvL0, - mePuResult->xMvL1, - mePuResult->yMvL1); - cuInterSad = mePuResult->distortionDirection[0].distortion; + + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexInRaterScan]; + cuInterRate = MdcInterCuRate( + mePuResult->distortionDirection[0].direction, + mePuResult->xMvL0, + mePuResult->yMvL0, + mePuResult->xMvL1, + mePuResult->yMvL1); + cuInterSad = mePuResult->distortionDirection[0].distortion; cuInterCost = (cuInterSad << COST_PRECISION) + ((contextPtr->lambda * cuInterRate + MD_OFFSET) >> MD_SHIFT); diff --git a/Source/Lib/Codec/EbModeDecisionConfiguration.h b/Source/Lib/Codec/EbModeDecisionConfiguration.h index 91ee8d0c6..2e8159890 100644 --- a/Source/Lib/Codec/EbModeDecisionConfiguration.h +++ b/Source/Lib/Codec/EbModeDecisionConfiguration.h @@ -15,15 +15,15 @@ extern "C" { #endif /******************************************* - * EarlyModeDecisionLcu + * EarlyModeDecisionLcu * predicts candidates (LCU) *******************************************/ extern EB_ERRORTYPE EarlyModeDecisionLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 lcuIndex, - ModeDecisionConfigurationContext_t *contextPtr); + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 lcuIndex, + ModeDecisionConfigurationContext_t *contextPtr); /******************************************* @@ -31,20 +31,20 @@ extern EB_ERRORTYPE EarlyModeDecisionLcu( * Derive Lcu For Each Leaf (LCU) *******************************************/ extern EB_ERRORTYPE DeriveDeltaQPForEachLeafLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 lcuIndex, - EB_S32 intraMinDistance, - EB_S32 intraMaxDistance, - EB_S32 interMinDistance, - EB_S32 interMaxDistance, - ModeDecisionConfigurationContext_t *contextPtr); + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 lcuIndex, + EB_S32 intraMinDistance, + EB_S32 intraMaxDistance, + EB_S32 interMinDistance, + EB_S32 interMaxDistance, + ModeDecisionConfigurationContext_t *contextPtr); extern EB_U8 DeriveContouringClass( PictureParentControlSet_t *parentPcsPtr, EB_U16 lcuIndex, - EB_U8 leafIndex); + EB_U8 leafIndex); /************************************** * Function Ptrs Definitions **************************************/ @@ -69,548 +69,548 @@ typedef EB_ERRORTYPE(*EB_MDC_FUNC)( EB_ALIGN(16) static const EB_U8 NdpRefinementControlNREF[MAX_TEMPORAL_LAYERS/*temporal layer*/][4/*cu Size*/] = { - // 64 32 16 8 - /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, + // 64 32 16 8 + /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, /* layer-1 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, /* layer-2 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, - /* layer-3 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, - /* layer-4 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, - /* layer-5 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, - }; + /* layer-3 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, + /* layer-4 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, + /* layer-5 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, + }; EB_ALIGN(16) static const EB_U8 NdpRefinementControl_FAST[MAX_TEMPORAL_LAYERS/*temporal layer*/][4/*cu Size*/] = { - // 64 32 16 8 - /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, + // 64 32 16 8 + /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, /* layer-1 */ { Pred , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, - /* layer-2 */ { Pred , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, - /* layer-3 */ { Pred , Pred , Pred , Pred + Predm1 }, - /* layer-4 */ { Pred , Pred , Pred , Pred + Predm1 }, - /* layer-5 */ { Pred , Pred , Pred , Pred + Predm1 }, - }; + /* layer-2 */ { Pred , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, + /* layer-3 */ { Pred , Pred , Pred , Pred + Predm1 }, + /* layer-4 */ { Pred , Pred , Pred , Pred + Predm1 }, + /* layer-5 */ { Pred , Pred , Pred , Pred + Predm1 }, + }; EB_ALIGN(16) static const EB_U8 NdpRefinementControl_ISLICE[4/*cu Size*/] = { - Predp1, Pred + Predp1 + Predp2, Predm1 + Pred + Predp1, Predm1 + Pred + Predp1, Pred + Predp1 + Predp2, Predm1 + Pred + Predp1, Predm1 + Pred }; // Max FullCandidates Settings For Intra Frame EB_ALIGN(16) static const EB_U8 NdpRefinementControl_ISLICE_Sub4K[4/*cu Size*/] = -{ - Predp1+Predp2 ,Pred+Predp1+Predp2 ,Predm1+Pred+Predp1 ,Predm1+Pred +{ + Predp1+Predp2 ,Pred+Predp1+Predp2 ,Predm1+Pred+Predp1 ,Predm1+Pred }; EB_ALIGN(32) static const EB_U32 mvBitTable[500][500] = { - { 73744, 128728, 203592, 203592, 269128, 269128, 269128, 269128, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344 }, // 0 - { 130975, 178780, 253644, 253644, 319180, 319180, 319180, 319180, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396 }, // 1 - { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 2 - { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 3 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 4 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 5 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 6 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 7 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 8 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 9 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 10 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 11 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 12 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 13 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 14 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 15 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 16 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 17 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 18 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 19 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 20 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 21 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 22 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 23 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 24 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 25 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 26 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 27 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 28 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 29 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 30 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 31 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 32 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 33 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 34 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 35 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 36 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 37 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 38 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 39 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 40 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 41 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 42 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 43 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 44 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 45 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 46 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 47 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 48 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 49 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 50 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 51 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 52 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 53 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 54 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 55 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 56 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 57 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 58 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 59 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 60 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 61 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 62 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 63 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 64 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 65 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 66 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 67 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 68 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 69 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 70 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 71 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 72 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 73 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 74 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 75 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 76 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 77 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 78 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 79 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 80 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 81 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 82 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 83 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 84 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 85 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 86 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 87 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 88 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 89 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 90 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 91 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 92 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 93 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 94 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 95 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 96 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 97 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 98 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 99 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 100 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 101 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 102 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 103 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 104 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 105 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 106 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 107 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 108 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 109 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 110 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 111 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 112 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 113 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 114 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 115 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 116 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 117 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 118 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 119 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 120 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 121 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 122 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 123 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 124 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 125 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 126 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 127 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 128 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 129 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 130 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 131 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 132 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 133 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 134 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 135 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 136 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 137 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 138 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 139 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 140 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 141 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 142 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 143 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 144 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 145 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 146 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 147 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 148 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 149 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 150 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 151 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 152 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 153 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 154 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 155 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 156 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 157 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 158 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 159 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 160 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 161 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 162 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 163 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 164 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 165 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 166 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 167 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 168 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 169 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 170 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 171 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 172 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 173 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 174 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 175 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 176 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 177 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 178 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 179 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 180 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 181 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 182 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 183 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 184 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 185 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 186 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 187 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 188 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 189 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 190 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 191 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 192 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 193 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 194 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 195 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 196 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 197 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 198 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 199 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 200 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 201 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 202 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 203 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 204 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 205 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 206 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 207 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 208 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 209 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 210 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 211 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 212 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 213 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 214 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 215 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 216 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 217 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 218 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 219 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 220 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 221 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 222 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 223 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 224 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 225 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 226 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 227 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 228 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 229 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 230 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 231 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 232 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 233 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 234 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 235 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 236 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 237 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 238 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 239 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 240 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 241 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 242 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 243 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 244 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 245 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 246 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 247 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 248 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 249 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 250 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 251 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 252 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 253 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 254 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 255 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 256 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 257 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 258 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 259 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 260 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 261 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 262 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 263 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 264 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 265 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 266 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 267 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 268 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 269 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 270 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 271 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 272 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 273 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 274 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 275 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 276 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 277 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 278 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 279 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 280 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 281 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 282 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 283 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 284 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 285 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 286 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 287 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 288 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 289 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 290 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 291 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 292 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 293 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 294 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 295 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 296 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 297 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 298 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 299 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 300 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 301 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 302 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 303 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 304 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 305 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 306 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 307 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 308 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 309 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 310 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 311 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 312 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 313 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 314 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 315 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 316 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 317 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 318 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 319 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 320 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 321 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 322 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 323 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 324 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 325 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 326 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 327 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 328 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 329 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 330 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 331 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 332 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 333 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 334 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 335 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 336 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 337 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 338 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 339 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 340 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 341 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 342 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 343 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 344 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 345 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 346 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 347 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 348 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 349 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 350 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 351 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 352 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 353 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 354 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 355 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 356 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 357 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 358 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 359 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 360 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 361 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 362 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 363 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 364 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 365 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 366 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 367 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 368 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 369 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 370 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 371 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 372 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 373 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 374 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 375 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 376 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 377 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 378 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 379 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 380 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 381 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 382 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 383 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 384 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 385 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 386 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 387 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 388 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 389 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 390 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 391 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 392 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 393 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 394 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 395 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 396 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 397 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 398 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 399 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 400 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 401 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 402 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 403 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 404 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 405 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 406 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 407 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 408 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 409 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 410 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 411 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 412 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 413 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 414 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 415 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 416 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 417 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 418 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 419 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 420 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 421 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 422 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 423 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 424 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 425 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 426 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 427 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 428 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 429 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 430 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 431 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 432 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 433 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 434 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 435 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 436 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 437 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 438 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 439 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 440 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 441 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 442 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 443 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 444 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 445 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 446 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 447 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 448 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 449 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 450 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 451 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 452 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 453 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 454 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 455 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 456 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 457 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 458 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 459 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 460 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 461 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 462 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 463 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 464 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 465 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 466 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 467 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 468 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 469 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 470 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 471 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 472 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 473 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 474 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 475 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 476 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 477 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 478 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 479 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 480 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 481 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 482 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 483 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 484 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 485 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 486 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 487 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 488 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 489 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 490 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 491 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 492 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 493 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 494 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 495 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 496 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 497 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 498 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 499 + { 73744, 128728, 203592, 203592, 269128, 269128, 269128, 269128, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344 }, // 0 + { 130975, 178780, 253644, 253644, 319180, 319180, 319180, 319180, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396 }, // 1 + { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 2 + { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 3 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 4 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 5 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 6 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 7 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 8 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 9 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 10 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 11 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 12 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 13 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 14 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 15 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 16 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 17 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 18 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 19 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 20 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 21 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 22 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 23 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 24 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 25 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 26 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 27 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 28 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 29 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 30 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 31 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 32 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 33 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 34 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 35 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 36 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 37 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 38 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 39 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 40 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 41 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 42 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 43 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 44 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 45 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 46 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 47 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 48 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 49 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 50 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 51 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 52 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 53 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 54 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 55 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 56 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 57 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 58 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 59 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 60 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 61 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 62 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 63 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 64 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 65 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 66 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 67 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 68 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 69 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 70 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 71 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 72 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 73 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 74 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 75 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 76 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 77 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 78 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 79 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 80 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 81 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 82 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 83 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 84 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 85 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 86 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 87 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 88 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 89 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 90 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 91 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 92 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 93 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 94 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 95 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 96 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 97 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 98 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 99 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 100 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 101 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 102 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 103 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 104 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 105 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 106 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 107 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 108 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 109 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 110 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 111 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 112 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 113 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 114 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 115 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 116 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 117 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 118 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 119 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 120 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 121 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 122 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 123 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 124 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 125 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 126 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 127 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 128 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 129 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 130 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 131 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 132 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 133 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 134 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 135 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 136 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 137 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 138 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 139 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 140 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 141 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 142 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 143 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 144 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 145 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 146 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 147 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 148 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 149 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 150 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 151 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 152 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 153 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 154 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 155 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 156 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 157 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 158 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 159 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 160 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 161 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 162 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 163 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 164 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 165 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 166 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 167 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 168 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 169 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 170 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 171 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 172 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 173 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 174 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 175 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 176 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 177 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 178 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 179 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 180 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 181 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 182 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 183 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 184 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 185 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 186 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 187 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 188 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 189 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 190 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 191 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 192 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 193 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 194 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 195 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 196 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 197 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 198 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 199 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 200 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 201 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 202 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 203 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 204 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 205 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 206 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 207 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 208 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 209 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 210 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 211 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 212 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 213 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 214 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 215 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 216 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 217 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 218 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 219 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 220 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 221 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 222 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 223 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 224 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 225 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 226 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 227 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 228 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 229 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 230 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 231 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 232 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 233 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 234 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 235 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 236 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 237 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 238 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 239 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 240 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 241 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 242 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 243 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 244 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 245 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 246 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 247 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 248 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 249 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 250 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 251 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 252 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 253 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 254 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 255 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 256 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 257 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 258 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 259 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 260 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 261 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 262 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 263 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 264 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 265 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 266 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 267 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 268 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 269 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 270 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 271 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 272 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 273 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 274 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 275 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 276 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 277 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 278 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 279 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 280 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 281 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 282 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 283 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 284 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 285 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 286 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 287 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 288 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 289 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 290 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 291 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 292 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 293 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 294 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 295 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 296 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 297 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 298 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 299 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 300 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 301 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 302 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 303 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 304 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 305 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 306 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 307 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 308 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 309 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 310 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 311 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 312 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 313 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 314 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 315 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 316 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 317 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 318 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 319 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 320 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 321 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 322 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 323 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 324 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 325 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 326 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 327 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 328 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 329 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 330 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 331 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 332 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 333 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 334 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 335 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 336 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 337 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 338 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 339 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 340 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 341 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 342 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 343 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 344 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 345 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 346 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 347 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 348 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 349 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 350 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 351 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 352 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 353 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 354 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 355 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 356 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 357 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 358 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 359 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 360 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 361 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 362 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 363 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 364 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 365 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 366 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 367 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 368 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 369 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 370 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 371 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 372 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 373 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 374 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 375 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 376 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 377 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 378 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 379 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 380 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 381 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 382 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 383 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 384 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 385 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 386 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 387 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 388 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 389 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 390 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 391 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 392 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 393 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 394 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 395 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 396 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 397 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 398 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 399 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 400 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 401 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 402 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 403 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 404 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 405 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 406 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 407 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 408 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 409 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 410 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 411 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 412 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 413 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 414 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 415 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 416 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 417 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 418 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 419 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 420 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 421 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 422 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 423 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 424 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 425 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 426 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 427 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 428 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 429 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 430 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 431 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 432 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 433 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 434 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 435 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 436 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 437 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 438 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 439 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 440 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 441 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 442 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 443 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 444 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 445 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 446 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 447 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 448 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 449 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 450 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 451 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 452 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 453 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 454 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 455 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 456 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 457 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 458 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 459 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 460 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 461 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 462 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 463 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 464 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 465 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 466 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 467 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 468 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 469 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 470 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 471 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 472 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 473 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 474 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 475 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 476 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 477 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 478 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 479 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 480 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 481 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 482 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 483 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 484 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 485 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 486 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 487 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 488 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 489 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 490 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 491 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 492 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 493 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 494 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 495 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 496 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 497 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 498 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 499 }; #ifdef __cplusplus } #endif -#endif // EbModeDecisionConfiguration_h \ No newline at end of file +#endif // EbModeDecisionConfiguration_h diff --git a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c index 032b46d57..30ed50237 100644 --- a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c +++ b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c @@ -23,35 +23,35 @@ #define UNDER_SHOOTING 0 #define OVER_SHOOTING 1 #define TBD_SHOOTING 2 - + // Set a cost to each search method (could be modified) // EB30 @ Revision 12879 -#define PRED_OPEN_LOOP_1_NFL_COST 97 // PRED_OPEN_LOOP_1_NFL_COST is ~03% faster than PRED_OPEN_LOOP_COST +#define PRED_OPEN_LOOP_1_NFL_COST 97 // PRED_OPEN_LOOP_1_NFL_COST is ~03% faster than PRED_OPEN_LOOP_COST #define U_099 99 -#define PRED_OPEN_LOOP_COST 100 // Let's assume PRED_OPEN_LOOP_COST costs ~100 U +#define PRED_OPEN_LOOP_COST 100 // Let's assume PRED_OPEN_LOOP_COST costs ~100 U #define U_101 101 #define U_102 102 #define U_103 103 -#define U_104 104 +#define U_104 104 #define U_105 105 -#define LIGHT_OPEN_LOOP_COST 106 // L_MDC is ~06% slower than PRED_OPEN_LOOP_COST -#define U_107 107 -#define U_108 108 +#define LIGHT_OPEN_LOOP_COST 106 // L_MDC is ~06% slower than PRED_OPEN_LOOP_COST +#define U_107 107 +#define U_108 108 #define U_109 109 #define OPEN_LOOP_COST 110 // F_MDC is ~10% slower than PRED_OPEN_LOOP_COST #define U_111 111 #define U_112 112 #define U_113 113 #define U_114 114 -#define U_115 115 +#define U_115 115 #define U_116 116 #define U_117 117 #define U_119 119 #define U_120 120 #define U_121 121 #define U_122 122 -#define LIGHT_AVC_COST 122 +#define LIGHT_AVC_COST 122 #define LIGHT_BDP_COST 123 // L_BDP is ~23% slower than PRED_OPEN_LOOP_COST #define U_125 125 #define U_127 127 @@ -107,39 +107,39 @@ static const EB_U8 AdpLuminosityChangeThArray[MAX_HIERARCHICAL_LEVEL][MAX_TEMPOR /****************************************************** -* Compute picture and slice level chroma QP offsets +* Compute picture and slice level chroma QP offsets ******************************************************/ static void SetSliceAndPictureChromaQpOffsets( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - // This is a picture level chroma QP offset and is sent in the PPS - pictureControlSetPtr->cbQpOffset = 0; - pictureControlSetPtr->crQpOffset = 0; + // This is a picture level chroma QP offset and is sent in the PPS + pictureControlSetPtr->cbQpOffset = 0; + pictureControlSetPtr->crQpOffset = 0; - //In order to have QP offsets for chroma at a slice level set sliceLevelChromaQpFlag flag in pictureControlSetPtr (can be done in the PCS Ctor) + //In order to have QP offsets for chroma at a slice level set sliceLevelChromaQpFlag flag in pictureControlSetPtr (can be done in the PCS Ctor) - // The below are slice level chroma QP offsets and is sent for each slice when sliceLevelChromaQpFlag is set + // The below are slice level chroma QP offsets and is sent for each slice when sliceLevelChromaQpFlag is set - // IMPORTANT: Lambda tables assume that the cb and cr have the same QP offsets. - // However the offsets for each component can be very different for ENC DEC and we are conformant. - pictureControlSetPtr->sliceCbQpOffset = 0; - pictureControlSetPtr->sliceCrQpOffset = 0; + // IMPORTANT: Lambda tables assume that the cb and cr have the same QP offsets. + // However the offsets for each component can be very different for ENC DEC and we are conformant. + pictureControlSetPtr->sliceCbQpOffset = 0; + pictureControlSetPtr->sliceCrQpOffset = 0; - if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_6){ + if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_6){ - pictureControlSetPtr->sliceCbQpOffset = 10; - pictureControlSetPtr->sliceCrQpOffset = 10; + pictureControlSetPtr->sliceCbQpOffset = 10; + pictureControlSetPtr->sliceCrQpOffset = 10; - } - else if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ + } + else if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ - pictureControlSetPtr->sliceCbQpOffset = 8; - pictureControlSetPtr->sliceCrQpOffset = 8; + pictureControlSetPtr->sliceCbQpOffset = 8; + pictureControlSetPtr->sliceCrQpOffset = 8; - } - else{ + } + else{ if (contextPtr->chromaQpOffsetLevel == 0) { @@ -165,7 +165,7 @@ static void SetSliceAndPictureChromaQpOffsets( } } - } + } } @@ -179,11 +179,11 @@ static void AdaptiveDlfParameterComputation( EbReferenceObject_t * refObjL0, *refObjL1; EB_U8 highIntra = 0; - EB_BOOL tcBetaOffsetManipulation = EB_FALSE; + EB_BOOL tcBetaOffsetManipulation = EB_FALSE; pictureControlSetPtr->highIntraSlection = highIntra; - pictureControlSetPtr->tcOffset = 0; - pictureControlSetPtr->betaOffset = 0; + pictureControlSetPtr->tcOffset = 0; + pictureControlSetPtr->betaOffset = 0; (void)contextPtr; @@ -192,7 +192,7 @@ static void AdaptiveDlfParameterComputation( refObjL0 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refObjL1 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; - if ((refObjL0->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL0->tmpLayerIdx]) && (refObjL1->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL1->tmpLayerIdx])) + if ((refObjL0->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL0->tmpLayerIdx]) && (refObjL1->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL1->tmpLayerIdx])) highIntra = 1; else @@ -211,16 +211,16 @@ static void AdaptiveDlfParameterComputation( } if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ - + refObjL0 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refObjL1 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; if (pictureControlSetPtr->temporalLayerIndex == 0){ - highIntra = (pictureControlSetPtr->ParentPcsPtr->intraCodedBlockProbability > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->temporalLayerIndex]) ? 1 : 0; + highIntra = (pictureControlSetPtr->ParentPcsPtr->intraCodedBlockProbability > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->temporalLayerIndex]) ? 1 : 0; } else{ highIntra = (refObjL0->penalizeSkipflag || refObjL1->penalizeSkipflag) ? 1 : 0; } - + } if (tcBetaOffsetManipulation){ @@ -240,13 +240,13 @@ static void AdaptiveDlfParameterComputation( pictureControlSetPtr->highIntraSlection = highIntra; - if (pictureControlSetPtr->temporalLayerIndex == 0 && - pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1 && - pictureControlSetPtr->pictureQp >= 37) { + if (pictureControlSetPtr->temporalLayerIndex == 0 && + pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1 && + pictureControlSetPtr->pictureQp >= 37) { - pictureControlSetPtr->tcOffset = 0; - pictureControlSetPtr->betaOffset = 0; - } + pictureControlSetPtr->tcOffset = 0; + pictureControlSetPtr->betaOffset = 0; + } } @@ -259,14 +259,14 @@ EB_ERRORTYPE ModeDecisionConfigurationContextCtor( EbFifo_t *rateControlInputFifoPtr, EbFifo_t *modeDecisionConfigurationOutputFifoPtr, - EB_U16 lcuTotalCount) + EB_U16 lcuTotalCount) { ModeDecisionConfigurationContext_t *contextPtr; EB_MALLOC(ModeDecisionConfigurationContext_t*, contextPtr, sizeof(ModeDecisionConfigurationContext_t), EB_N_PTR); *contextDblPtr = contextPtr; - + // Input/Output System Resource Manager FIFOs contextPtr->rateControlInputFifoPtr = rateControlInputFifoPtr; contextPtr->modeDecisionConfigurationOutputFifoPtr = modeDecisionConfigurationOutputFifoPtr; @@ -274,7 +274,7 @@ EB_ERRORTYPE ModeDecisionConfigurationContextCtor( EB_MALLOC(MdRateEstimationContext_t*, contextPtr->mdRateEstimationPtr, sizeof(MdRateEstimationContext_t), EB_N_PTR); - // Budgeting + // Budgeting EB_MALLOC(EB_U32*,contextPtr->lcuScoreArray,sizeof(EB_U32) * lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_U8 *,contextPtr->lcuCostArray ,sizeof(EB_U8 ) * lcuTotalCount, EB_N_PTR); @@ -286,18 +286,18 @@ EB_ERRORTYPE ModeDecisionConfigurationContextCtor( * Predict the LCU partitionning ******************************************************/ static void PerformEarlyLcuPartitionning( - ModeDecisionConfigurationContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr) + ModeDecisionConfigurationContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr) { - LargestCodingUnit_t *lcuPtr; - EB_U32 lcuIndex; - EB_U32 sliceType; + LargestCodingUnit_t *lcuPtr; + EB_U32 lcuIndex; + EB_U32 sliceType; - // MD Conf Rate Estimation Array from encodeContext - MdRateEstimationContext_t *mdConfRateEstimationArray; + // MD Conf Rate Estimation Array from encodeContext + MdRateEstimationContext_t *mdConfRateEstimationArray; - // Lambda Assignement + // Lambda Assignement if (pictureControlSetPtr->temporalLayerIndex == 0) { contextPtr->lambda = lambdaModeDecisionRaSadBase[contextPtr->qp]; @@ -310,27 +310,27 @@ static void PerformEarlyLcuPartitionning( } - // Slice Type - sliceType = - (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : - pictureControlSetPtr->sliceType; + // Slice Type + sliceType = + (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : + pictureControlSetPtr->sliceType; - // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type - mdConfRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; - mdConfRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; + // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type + mdConfRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; + mdConfRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; - // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray - EB_MEMCPY(&(contextPtr->mdRateEstimationPtr->splitFlagBits[0]), &(mdConfRateEstimationArray->splitFlagBits[0]), sizeof(EB_BitFraction)* MAX_SIZE_OF_MD_RATE_ESTIMATION_CASES); + // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray + EB_MEMCPY(&(contextPtr->mdRateEstimationPtr->splitFlagBits[0]), &(mdConfRateEstimationArray->splitFlagBits[0]), sizeof(EB_BitFraction)* MAX_SIZE_OF_MD_RATE_ESTIMATION_CASES); pictureControlSetPtr->ParentPcsPtr->averageQp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; - // LCU Loop : Partitionnig Decision - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + // LCU Loop : Partitionnig Decision + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; { - lcuPtr->qp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; - } + lcuPtr->qp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; + } EarlyModeDecisionLcu( sequenceControlSetPtr, @@ -339,19 +339,19 @@ static void PerformEarlyLcuPartitionning( lcuIndex, contextPtr); - } // End of LCU Loop + } // End of LCU Loop } static void PerformEarlyLcuPartitionningLcu( - ModeDecisionConfigurationContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + ModeDecisionConfigurationContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - LargestCodingUnit_t *lcuPtr; + LargestCodingUnit_t *lcuPtr; - // LCU Loop : Partitionnig Decision + // LCU Loop : Partitionnig Decision lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; { lcuPtr->qp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; @@ -388,7 +388,7 @@ static void Forward85CuToModeDecisionLCU( { switch (cuStatsPtr->depth){ - case 0: + case 0: resultsPtr->leafDataArray[resultsPtr->leafCount].leafIndex = cuIndex; resultsPtr->leafDataArray[resultsPtr->leafCount++].splitFlag = splitFlag = EB_TRUE; break; @@ -442,7 +442,7 @@ static void Forward84CuToModeDecisionLCU( { switch (cuStatsPtr->depth){ - case 0: + case 0: splitFlag = EB_TRUE; break; @@ -497,8 +497,8 @@ static void Forward85CuToModeDecision( switch (cuStatsPtr->depth){ case 0: - resultsPtr->leafDataArray[resultsPtr->leafCount].leafIndex = cuIndex; - resultsPtr->leafDataArray[resultsPtr->leafCount++].splitFlag = splitFlag = EB_TRUE; + resultsPtr->leafDataArray[resultsPtr->leafCount].leafIndex = cuIndex; + resultsPtr->leafDataArray[resultsPtr->leafCount++].splitFlag = splitFlag = EB_TRUE; break; case 1: @@ -556,7 +556,7 @@ static void Forward84CuToModeDecision( switch (cuStatsPtr->depth){ case 0: - splitFlag = EB_TRUE; + splitFlag = EB_TRUE; break; case 1: @@ -702,15 +702,15 @@ static void Forward16x16CuToModeDecisionLCU( } // End CU Loop } -static void PartitioningInitialization( +static void PartitioningInitialization( SequenceControlSet_t *sequenceControlSetPtr, PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 sliceType; + EB_U32 sliceType; // MD Conf Rate Estimation Array from encodeContext - MdRateEstimationContext_t *mdConfRateEstimationArray; + MdRateEstimationContext_t *mdConfRateEstimationArray; // Lambda Assignement if (pictureControlSetPtr->temporalLayerIndex == 0) { @@ -743,164 +743,164 @@ static void PartitioningInitialization( ******************************************************/ static void DetectComplexNonFlatMovingLcu( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 pictureWidthInLcu) { + PictureControlSet_t *pictureControlSetPtr, + EB_U32 pictureWidthInLcu) { - LargestCodingUnit_t *lcuPtr; - EB_U32 lcuIndex; + LargestCodingUnit_t *lcuPtr; + EB_U32 lcuIndex; if (pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage != INVALID_ZZ_COST && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage >= 10 && pictureControlSetPtr->temporalLayerIndex <= 2) { - // Determine deltaQP and assign QP value for each leaf - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + // Determine deltaQP and assign QP value for each leaf + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; - EB_BOOL condition = EB_FALSE; + EB_BOOL condition = EB_FALSE; - if (!pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArray[lcuIndex] && + if (!pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArray[lcuIndex] && lcuPtr->pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum > 0) { - condition = EB_TRUE; - } + condition = EB_TRUE; + } - if (condition){ - EB_U32 counter = 0; + if (condition){ + EB_U32 counter = 0; - if (!lcuParams->isEdgeLcu){ - // Top + if (!lcuParams->isEdgeLcu){ + // Top if (pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex - pictureWidthInLcu].edgeBlockNum == 0) counter++; // Bottom if (pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex + pictureWidthInLcu].edgeBlockNum == 0) counter++; - // Left + // Left if (pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex - 1].edgeBlockNum == 0) counter++; // right if (pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex + 1].edgeBlockNum == 0) counter++; - } - } - } - } + } + } + } + } } static EB_AURA_STATUS AuraDetection64x64( - PictureControlSet_t *pictureControlSetPtr, - EB_U8 pictureQp, - EB_U32 lcuIndex - ) + PictureControlSet_t *pictureControlSetPtr, + EB_U8 pictureQp, + EB_U32 lcuIndex + ) { - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_S32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + MAX_LCU_SIZE - 1) >> MAX_LOG2_LCU_SIZE; - EB_U32 currDist; - EB_U32 topDist, topLDist, topRDist; - EB_U32 localAvgDist, distThresh0, distThresh1; - EB_S32 lcuOffset; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_S32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + MAX_LCU_SIZE - 1) >> MAX_LOG2_LCU_SIZE; + EB_U32 currDist; + EB_U32 topDist, topLDist, topRDist; + EB_U32 localAvgDist, distThresh0, distThresh1; + EB_S32 lcuOffset; - EB_AURA_STATUS auraClass = AURA_STATUS_0; - EB_U8 auraClass1 = 0; - EB_U8 auraClass2 = 0; + EB_AURA_STATUS auraClass = AURA_STATUS_0; + EB_U8 auraClass1 = 0; + EB_U8 auraClass2 = 0; - EB_S32 xMv0 = 0; - EB_S32 yMv0 = 0; - EB_S32 xMv1 = 0; - EB_S32 yMv1 = 0; + EB_S32 xMv0 = 0; + EB_S32 yMv0 = 0; + EB_S32 xMv1 = 0; + EB_S32 yMv1 = 0; - EB_U32 leftDist, rightDist; + EB_U32 leftDist, rightDist; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - distThresh0 = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag ||sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE ? 15 : 14; - distThresh1 = 23; + distThresh0 = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag ||sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE ? 15 : 14; + distThresh1 = 23; - if (pictureQp > 38){ - distThresh0 = distThresh0 << 2; - distThresh1 = distThresh1 << 2; - } + if (pictureQp > 38){ + distThresh0 = distThresh0 << 2; + distThresh1 = distThresh1 << 2; + } - if (!lcuParams->isEdgeLcu){ - - EB_U32 k; + if (!lcuParams->isEdgeLcu){ - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][0]; + EB_U32 k; - //Curr Block + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][0]; - for (k = 0; k < mePuResult->totalMeCandidateIndex; k++) { + //Curr Block - if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_0) { - // Get reference list 0 / reference index 0 MV - xMv0 = mePuResult->xMvL0; - yMv0 = mePuResult->yMvL0; - } - if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_1) { - // Get reference list 1 / reference index 0 MV - xMv1 = mePuResult->xMvL1; - yMv1 = mePuResult->yMvL1; - } + for (k = 0; k < mePuResult->totalMeCandidateIndex; k++) { - } - currDist = mePuResult->distortionDirection[0].distortion; + if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_0) { + // Get reference list 0 / reference index 0 MV + xMv0 = mePuResult->xMvL0; + yMv0 = mePuResult->yMvL0; + } + if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_1) { + // Get reference list 1 / reference index 0 MV + xMv1 = mePuResult->xMvL1; + yMv1 = mePuResult->yMvL1; + } + + } + currDist = mePuResult->distortionDirection[0].distortion; - if ((currDist > 64 * 64) && - // Only mark a block as aura when it is moving (MV amplitude higher than X; X is temporal layer dependent) - (abs(xMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || - abs(yMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || - abs(xMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || - abs(yMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex])) - { + if ((currDist > 64 * 64) && + // Only mark a block as aura when it is moving (MV amplitude higher than X; X is temporal layer dependent) + (abs(xMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || + abs(yMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || + abs(xMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || + abs(yMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex])) + { - //Top Distortion - lcuOffset = -pictureWidthInLcu; - topDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //Top Distortion + lcuOffset = -pictureWidthInLcu; + topDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; - //TopLeft Distortion - lcuOffset = -pictureWidthInLcu - 1; - topLDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //TopLeft Distortion + lcuOffset = -pictureWidthInLcu - 1; + topLDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; - //TopRightDistortion - lcuOffset = -pictureWidthInLcu + 1; - topRDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //TopRightDistortion + lcuOffset = -pictureWidthInLcu + 1; + topRDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; topRDist = (lcuParams->horizontalIndex < (EB_U32)(pictureWidthInLcu - 2)) ? topRDist : currDist; - //left Distortion - lcuOffset = -1; - leftDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //left Distortion + lcuOffset = -1; + leftDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; - //RightDistortion - lcuOffset = 1; - rightDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //RightDistortion + lcuOffset = 1; + rightDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; rightDist = (lcuParams->horizontalIndex < (EB_U32)(pictureWidthInLcu - 2)) ? topRDist : currDist; - localAvgDist = MIN(MIN(MIN(topLDist, MIN(topRDist, topDist)), leftDist), rightDist); + localAvgDist = MIN(MIN(MIN(topLDist, MIN(topRDist, topDist)), leftDist), rightDist); - if (10 * currDist > distThresh0*localAvgDist){ - if (10 * currDist > distThresh1*localAvgDist) - auraClass2++; - else - auraClass1++; - } - } + if (10 * currDist > distThresh0*localAvgDist){ + if (10 * currDist > distThresh1*localAvgDist) + auraClass2++; + else + auraClass1++; + } + } - } + } - auraClass = (auraClass2 > 0 || auraClass1 > 0) ? AURA_STATUS_1 : AURA_STATUS_0; + auraClass = (auraClass2 > 0 || auraClass1 > 0) ? AURA_STATUS_1 : AURA_STATUS_0; - return auraClass; + return auraClass; } @@ -908,25 +908,25 @@ static EB_AURA_STATUS AuraDetection64x64( * Aura detection ******************************************************/ static void AuraDetection( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 pictureWidthInLcu, - EB_U32 pictureHeightInLcu) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 pictureWidthInLcu, + EB_U32 pictureHeightInLcu) { - EB_U32 lcuIndex; + EB_U32 lcuIndex; EB_U32 lcu_X; EB_U32 lcu_Y; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; + LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; - // Aura status intialization + // Aura status intialization lcuPtr->auraStatus = INVALID_AURA_STATUS; lcu_X = lcuParams->horizontalIndex; lcu_Y = lcuParams->verticalIndex; - if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ + if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ if ((lcu_X > 0) && (lcu_X < pictureWidthInLcu - 1) && (lcu_Y < pictureHeightInLcu - 1)){ lcuPtr->auraStatus = AuraDetection64x64( pictureControlSetPtr, @@ -934,7 +934,7 @@ static void AuraDetection( lcuPtr->index); } } - } + } return; } @@ -962,17 +962,17 @@ static EB_ERRORTYPE DeriveDefaultSegments( contextPtr->intervalCost[1] = contextPtr->costDepthMode[LCU_BDP_DEPTH_MODE - 1]; } - } - else { + } + else { if (contextPtr->budget > (EB_U32) (pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * BDP_COST)) { - + contextPtr->numberOfSegments = 2; - + contextPtr->scoreTh[0] = (EB_S8)((1 * 100) / contextPtr->numberOfSegments); contextPtr->intervalCost[0] = contextPtr->costDepthMode[LCU_BDP_DEPTH_MODE - 1]; contextPtr->intervalCost[1] = contextPtr->costDepthMode[LCU_FULL84_DEPTH_MODE - 1]; - } + } else if (contextPtr->budget > (EB_U32)(pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * OPEN_LOOP_COST)) { @@ -1001,7 +1001,7 @@ static EB_ERRORTYPE DeriveDefaultSegments( contextPtr->intervalCost[3] = contextPtr->costDepthMode[LCU_LIGHT_BDP_DEPTH_MODE - 1]; contextPtr->intervalCost[4] = contextPtr->costDepthMode[LCU_BDP_DEPTH_MODE - 1]; } - + } } else { @@ -1022,7 +1022,7 @@ static EB_ERRORTYPE DeriveDefaultSegments( contextPtr->intervalCost[3] = contextPtr->costDepthMode[LCU_LIGHT_BDP_DEPTH_MODE - 1]; contextPtr->intervalCost[4] = contextPtr->costDepthMode[LCU_BDP_DEPTH_MODE - 1]; contextPtr->intervalCost[5] = contextPtr->costDepthMode[LCU_FULL85_DEPTH_MODE - 1]; - } + } else if (contextPtr->budget > (EB_U32)(pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_115)) { contextPtr->numberOfSegments = 5; @@ -1065,7 +1065,7 @@ static EB_ERRORTYPE DeriveDefaultSegments( contextPtr->intervalCost[3] = contextPtr->costDepthMode[LCU_OPEN_LOOP_DEPTH_MODE - 1]; } } - + return return_error; } @@ -1076,42 +1076,42 @@ Output : budget per picture ******************************************************/ static void SetTargetBudgetOq( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionConfigurationContext_t *contextPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 budget; - - if (contextPtr->adpLevel <= ENC_MODE_3) { - if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? - pictureControlSetPtr->lcuTotalCount * U_152 : - pictureControlSetPtr->lcuTotalCount * U_150; - else - budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? - pictureControlSetPtr->lcuTotalCount * U_152 : - pictureControlSetPtr->lcuTotalCount * U_145; - } - else if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080p_RANGE) { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * AVC_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_134; - } - else { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_109; - } - } + EB_U32 budget; + + if (contextPtr->adpLevel <= ENC_MODE_3) { + if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? + pictureControlSetPtr->lcuTotalCount * U_152 : + pictureControlSetPtr->lcuTotalCount * U_150; + else + budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? + pictureControlSetPtr->lcuTotalCount * U_152 : + pictureControlSetPtr->lcuTotalCount * U_145; + } + else if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080p_RANGE) { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * AVC_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_134; + } + else { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_109; + } + } else if (contextPtr->adpLevel <= ENC_MODE_5) { if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) { if (pictureControlSetPtr->temporalLayerIndex == 0) @@ -1141,43 +1141,43 @@ static void SetTargetBudgetOq( else budget = pictureControlSetPtr->lcuTotalCount * U_121; } - } - else if (contextPtr->adpLevel <= ENC_MODE_7) { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_109; - } + } + else if (contextPtr->adpLevel <= ENC_MODE_7) { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_109; + } else if (contextPtr->adpLevel <= ENC_MODE_8) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) - budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_127 : - (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_125 : - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_121; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) - budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * OPEN_LOOP_COST : - (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; - else - budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; - } - else { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_109; - } - } + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) + budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_127 : + (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_125 : + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_121; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) + budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * OPEN_LOOP_COST : + (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; + else + budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; + } + else { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_109; + } + } else if (contextPtr->adpLevel <= ENC_MODE_10) { if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? @@ -1221,8 +1221,8 @@ static void SetTargetBudgetOq( /****************************************************** * IsAvcPartitioningMode() - * Returns TRUE for LCUs where only Depth2 & Depth3 - * (AVC Partitioning) are goind to be tested by MD + * Returns TRUE for LCUs where only Depth2 & Depth3 + * (AVC Partitioning) are goind to be tested by MD * The LCU is marked if Sharpe Edge or Potential Aura/Grass * or B-Logo or S-Logo or Potential Blockiness Area * Input: Sharpe Edge, Potential Aura/Grass, B-Logo, S-Logo, Potential Blockiness Area signals @@ -1233,44 +1233,44 @@ static EB_BOOL IsAvcPartitioningMode( PictureControlSet_t *pictureControlSetPtr, LargestCodingUnit_t *lcuPtr) { - const EB_U32 lcuIndex = lcuPtr->index; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - EB_U8 edgeBlockNum = pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum; - LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuIndex]); - EB_U8 stationaryEdgeOverTimeFlag = lcuStatPtr->stationaryEdgeOverTimeFlag; - - EB_U8 auraStatus = lcuPtr->auraStatus; - - // No refinment for sub-1080p - if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) - return EB_FALSE; - - // Sharpe Edge - if (pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag && pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex > 0 && pictureControlSetPtr->ParentPcsPtr->sharpEdgeLcuFlag[lcuIndex] && !pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArrayAllLayers[lcuIndex]) { - return EB_TRUE; - } - - // Potential Aura/Grass - if (pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_0) { - if (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 60 && auraStatus == AURA_STATUS_1) { - if ((sliceType != EB_I_PICTURE && pictureControlSetPtr->highIntraSlection == 0) && (lcuParams->isCompleteLcu)) { - return EB_TRUE; - } - } - } - - // B-Logo - if (pictureControlSetPtr->ParentPcsPtr->logoPicFlag && edgeBlockNum) - return EB_TRUE; - - // S-Logo - if (stationaryEdgeOverTimeFlag > 0) - return EB_TRUE; - - // Potential Blockiness Area - if (pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuIndex] == LCU_COMPLEXITY_STATUS_2) - return EB_TRUE; + const EB_U32 lcuIndex = lcuPtr->index; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + EB_U8 edgeBlockNum = pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum; + LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuIndex]); + EB_U8 stationaryEdgeOverTimeFlag = lcuStatPtr->stationaryEdgeOverTimeFlag; + + EB_U8 auraStatus = lcuPtr->auraStatus; + + // No refinment for sub-1080p + if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) + return EB_FALSE; + + // Sharpe Edge + if (pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag && pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex > 0 && pictureControlSetPtr->ParentPcsPtr->sharpEdgeLcuFlag[lcuIndex] && !pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArrayAllLayers[lcuIndex]) { + return EB_TRUE; + } + + // Potential Aura/Grass + if (pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_0) { + if (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 60 && auraStatus == AURA_STATUS_1) { + if ((sliceType != EB_I_PICTURE && pictureControlSetPtr->highIntraSlection == 0) && (lcuParams->isCompleteLcu)) { + return EB_TRUE; + } + } + } + + // B-Logo + if (pictureControlSetPtr->ParentPcsPtr->logoPicFlag && edgeBlockNum) + return EB_TRUE; + + // S-Logo + if (stationaryEdgeOverTimeFlag > 0) + return EB_TRUE; + + // Potential Blockiness Area + if (pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuIndex] == LCU_COMPLEXITY_STATUS_2) + return EB_TRUE; return EB_FALSE; } @@ -1282,7 +1282,7 @@ static EB_BOOL IsAvcPartitioningMode( ******************************************************/ static void ConfigureAdp( PictureControlSet_t *pictureControlSetPtr, - ModeDecisionConfigurationContext_t *contextPtr) + ModeDecisionConfigurationContext_t *contextPtr) { contextPtr->costDepthMode[LCU_FULL85_DEPTH_MODE - 1] = FULL_SEARCH_COST; contextPtr->costDepthMode[LCU_FULL84_DEPTH_MODE - 1] = FULL_SEARCH_COST; @@ -1307,10 +1307,10 @@ static void ConfigureAdp( // Initialize the predicted budget contextPtr->predictedCost = (EB_U32) ~0; - // Initialize the predicted budget - contextPtr->predictedCost = (EB_U32)~0; + // Initialize the predicted budget + contextPtr->predictedCost = (EB_U32)~0; - // Derive the sensitive picture flag + // Derive the sensitive picture flag contextPtr->adpDepthSensitivePictureClass = DEPTH_SENSITIVE_PIC_CLASS_0; EB_BOOL luminosityChange = EB_FALSE; @@ -1325,11 +1325,11 @@ static void ConfigureAdp( } } - if (pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage != INVALID_ZZ_COST && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage < ADP_CONFIG_NON_MOVING_INDEX_TH_1) { // could not seen by the eye if very active + if (pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage != INVALID_ZZ_COST && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage < ADP_CONFIG_NON_MOVING_INDEX_TH_1) { // could not seen by the eye if very active if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass > PIC_NOISE_CLASS_3 || pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag ||luminosityChange) { // potential complex picture: luminosity Change (e.g. fade, light..) contextPtr->adpDepthSensitivePictureClass = DEPTH_SENSITIVE_PIC_CLASS_2; - } - // potential complex picture: light foreground and dark background(e.g.flash, light..) or moderate activity and high variance (noise or a lot of edge) + } + // potential complex picture: light foreground and dark background(e.g.flash, light..) or moderate activity and high variance (noise or a lot of edge) else if ( (pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage >= ADP_CONFIG_NON_MOVING_INDEX_TH_0 && pictureControlSetPtr->ParentPcsPtr->picNoiseClass == PIC_NOISE_CLASS_3)) { contextPtr->adpDepthSensitivePictureClass = DEPTH_SENSITIVE_PIC_CLASS_1; } @@ -1339,7 +1339,7 @@ static void ConfigureAdp( } /****************************************************** -* Assign a search method based on the allocated cost +* Assign a search method based on the allocated cost Input : allocated budget per LCU Output : search method per LCU ******************************************************/ @@ -1347,7 +1347,7 @@ static void DeriveSearchMethod( PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - + EB_U32 lcuIndex; @@ -1404,19 +1404,19 @@ static void SetLcuBudget( LargestCodingUnit_t *lcuPtr, ModeDecisionConfigurationContext_t *contextPtr) { - const EB_U32 lcuIndex = lcuPtr->index; + const EB_U32 lcuIndex = lcuPtr->index; EB_U32 maxToMinScore, scoreToMin; - const EB_BOOL isAvcPartitioningModeFlag = IsAvcPartitioningMode(sequenceControlSetPtr, pictureControlSetPtr, lcuPtr); + const EB_BOOL isAvcPartitioningModeFlag = IsAvcPartitioningMode(sequenceControlSetPtr, pictureControlSetPtr, lcuPtr); - if (contextPtr->adpRefinementMode == 2 && isAvcPartitioningModeFlag) { + if (contextPtr->adpRefinementMode == 2 && isAvcPartitioningModeFlag) { contextPtr->lcuCostArray[lcuIndex] = contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; contextPtr->predictedCost += contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; } - else if (contextPtr->adpRefinementMode == 1 && isAvcPartitioningModeFlag) { + else if (contextPtr->adpRefinementMode == 1 && isAvcPartitioningModeFlag) { contextPtr->lcuCostArray[lcuIndex] = contextPtr->costDepthMode[LCU_LIGHT_AVC_DEPTH_MODE - 1]; contextPtr->predictedCost += contextPtr->costDepthMode[LCU_LIGHT_AVC_DEPTH_MODE - 1]; @@ -1456,7 +1456,7 @@ static void SetLcuBudget( contextPtr->predictedCost += contextPtr->intervalCost[6]; } // Switch to AVC mode if the LCU cost is higher than the AVC cost and the the LCU is marked + adjust the current picture cost accordingly - if (isAvcPartitioningModeFlag) { + if (isAvcPartitioningModeFlag) { if (contextPtr->lcuCostArray[lcuIndex] > contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]) { contextPtr->predictedCost -= (contextPtr->lcuCostArray[lcuIndex] - contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]); contextPtr->lcuCostArray[lcuIndex] = contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; @@ -1481,16 +1481,16 @@ static void DeriveOptimalBudgetPerLcu( { EB_U32 lcuIndex; - // Initialize the deviation between the picture predicted cost & the target budget to 100, - EB_U32 deviationToTarget = 1000; - - // Set the adjustment step to 1 (could be increased for faster convergence), + // Initialize the deviation between the picture predicted cost & the target budget to 100, + EB_U32 deviationToTarget = 1000; + + // Set the adjustment step to 1 (could be increased for faster convergence), EB_S8 adjustementStep = 1; - + // Set the initial shooting state & the final shooting state to TBD EB_U32 initialShooting = TBD_SHOOTING; EB_U32 finalShooting = TBD_SHOOTING; - + EB_U8 maxAdjustementIteration = 100; EB_U8 adjustementIteration = 0; @@ -1506,7 +1506,7 @@ static void DeriveOptimalBudgetPerLcu( // reset running cost contextPtr->predictedCost = 0; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { LargestCodingUnit_t* lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; @@ -1517,7 +1517,7 @@ static void DeriveOptimalBudgetPerLcu( contextPtr); } - // Compute the deviation between the predicted budget & the target budget + // Compute the deviation between the predicted budget & the target budget deviationToTarget = (ABS((EB_S32)(contextPtr->predictedCost - contextPtr->budget)) * 1000) / contextPtr->budget; // Derive shooting status if (contextPtr->predictedCost < contextPtr->budget) { @@ -1548,19 +1548,19 @@ static void DeriveOptimalBudgetPerLcu( /****************************************************** * Compute the refinment cost Input : budget per picture, and the cost of the refinment - Output : the refinment flag + Output : the refinment flag ******************************************************/ static void ComputeRefinementCost( SequenceControlSet_t *sequenceControlSetPtr, PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - + EB_U32 lcuIndex; EB_U32 avcRefinementCost = 0; EB_U32 lightAvcRefinementCost = 0; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { LargestCodingUnit_t* lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; if (IsAvcPartitioningMode(sequenceControlSetPtr, pictureControlSetPtr, lcuPtr)) { avcRefinementCost += contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; @@ -1594,21 +1594,21 @@ static void ComputeRefinementCost( ******************************************************/ static void DeriveLcuScore( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionConfigurationContext_t *contextPtr) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 lcuIndex; + EB_U32 lcuIndex; EB_U32 lcuScore; EB_U32 distortion; contextPtr->lcuMinScore = ~0u; contextPtr->lcuMaxScore = 0u; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; lcuIndex++) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64] == EB_FALSE) { EB_U8 cu8x8Index; @@ -1631,8 +1631,8 @@ static void DeriveLcuScore( } lcuScore = distortion; - } - else { + } + else { if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64] == EB_FALSE) { EB_U8 cu8x8Index; @@ -1656,7 +1656,7 @@ static void DeriveLcuScore( lcuScore = distortion; - // Use uncovered area + // Use uncovered area if (pictureControlSetPtr->ParentPcsPtr->failingMotionLcuFlag[lcuIndex]) { lcuScore = pictureControlSetPtr->ParentPcsPtr->interComplexityMaxPre; @@ -1665,7 +1665,7 @@ static void DeriveLcuScore( else if ( // LCU @ a picture boundary lcuParams->isEdgeLcu - && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexArray[lcuIndex] != INVALID_ZZ_COST + && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexArray[lcuIndex] != INVALID_ZZ_COST && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage != INVALID_ZZ_COST // Active LCU && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexArray[lcuIndex] >= ADP_CLASS_NON_MOVING_INDEX_TH_0 @@ -1679,7 +1679,7 @@ static void DeriveLcuScore( } else { - // Use LCU variance & activity + // Use LCU variance & activity if (pictureControlSetPtr->ParentPcsPtr->nonMovingIndexArray[lcuIndex] == ADP_CLASS_NON_MOVING_INDEX_TH_2 && pictureControlSetPtr->ParentPcsPtr->variance[lcuIndex][RASTER_SCAN_CU_INDEX_64x64] > IS_COMPLEX_LCU_VARIANCE_TH && (sequenceControlSetPtr->staticConfig.frameRate >> 16) > 30) lcuScore -= (((lcuScore - pictureControlSetPtr->ParentPcsPtr->interComplexityMinPre) * ADP_CLASS_SHIFT_DIST_0) / 100); @@ -1697,14 +1697,14 @@ static void DeriveLcuScore( if (pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][RASTER_SCAN_CU_INDEX_64x64] < ADP_DARK_LCU_TH ) lcuScore -= (((lcuScore - pictureControlSetPtr->ParentPcsPtr->interComplexityMinPre) * ADP_CLASS_SHIFT_DIST_0) / 100); else - lcuScore += (((pictureControlSetPtr->ParentPcsPtr->interComplexityMaxPre - lcuScore) * ADP_CLASS_SHIFT_DIST_0) / 100); + lcuScore += (((pictureControlSetPtr->ParentPcsPtr->interComplexityMaxPre - lcuScore) * ADP_CLASS_SHIFT_DIST_0) / 100); } } } - } - + } + contextPtr->lcuScoreArray[lcuIndex] = lcuScore; // Track MIN & MAX LCU scores @@ -1713,7 +1713,7 @@ static void DeriveLcuScore( } - + } /****************************************************** @@ -1733,31 +1733,31 @@ static void DeriveLcuScore( ******************************************************/ static void PerformOutlierRemoval( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 maxInterval = 0; - EB_U32 subInterval = 0; - EB_U32 lcuScoreHistogram[10] = { 0 }; - EB_U32 lcuIndex; + EB_U32 maxInterval = 0; + EB_U32 subInterval = 0; + EB_U32 lcuScoreHistogram[10] = { 0 }; + EB_U32 lcuIndex; EB_U32 lcuScore; - EB_U32 processedlcuCount = 0; - EB_S32 slot = 0; + EB_U32 processedlcuCount = 0; + EB_S32 slot = 0; maxInterval = contextPtr->lcuMaxScore - contextPtr->lcuMinScore; // Consider 10 bins subInterval = maxInterval / 10; // Count # of LCUs at each bin - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; lcuIndex++) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64]) { + if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64]) { - processedlcuCount++; + processedlcuCount++; lcuScore = contextPtr->lcuScoreArray[lcuIndex] + contextPtr->lcuMinScore; if (lcuScore < (subInterval + contextPtr->lcuMinScore)){ @@ -1790,44 +1790,44 @@ static void PerformOutlierRemoval( else if (lcuScore < ((10 * subInterval) + contextPtr->lcuMinScore)){ lcuScoreHistogram[9]++; } - } - } - + } + } + // Zero-out the bin if percentage lower than VALID_SLOT_TH - for (slot = 0; slot < 10; slot++){ + for (slot = 0; slot < 10; slot++){ if (processedlcuCount > 0) { if ((lcuScoreHistogram[slot] * 100 / processedlcuCount) < VALID_SLOT_TH) { lcuScoreHistogram[slot] = 0; } } - } + } // Ignore null bins - for (slot = 0; slot < 10; slot++){ - if (lcuScoreHistogram[slot]){ - contextPtr->lcuMinScore = contextPtr->lcuMinScore+ (slot * subInterval); - break; - } - } - - for (slot = 9; slot >= 0; slot--){ - if (lcuScoreHistogram[slot]){ - contextPtr->lcuMaxScore = contextPtr->lcuMaxScore - ((9 - slot) * subInterval); - break; - } - } + for (slot = 0; slot < 10; slot++){ + if (lcuScoreHistogram[slot]){ + contextPtr->lcuMinScore = contextPtr->lcuMinScore+ (slot * subInterval); + break; + } + } + + for (slot = 9; slot >= 0; slot--){ + if (lcuScoreHistogram[slot]){ + contextPtr->lcuMaxScore = contextPtr->lcuMaxScore - ((9 - slot) * subInterval); + break; + } + } } /****************************************************** -* Assign a search method for each LCU +* Assign a search method for each LCU Input : LCU score, detection signals Output : search method for each LCU ******************************************************/ static void DeriveLcuMdMode( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - // Configure ADP + // Configure ADP ConfigureAdp( pictureControlSetPtr, contextPtr); @@ -1843,22 +1843,22 @@ static void DeriveLcuMdMode( pictureControlSetPtr, contextPtr); - // Compute the cost of the refinements + // Compute the cost of the refinements ComputeRefinementCost( sequenceControlSetPtr, pictureControlSetPtr, contextPtr); // Derive LCU score - DeriveLcuScore( - sequenceControlSetPtr, - pictureControlSetPtr, + DeriveLcuScore( + sequenceControlSetPtr, + pictureControlSetPtr, contextPtr); - // Remove the outliers - PerformOutlierRemoval( - sequenceControlSetPtr, - pictureControlSetPtr->ParentPcsPtr, + // Remove the outliers + PerformOutlierRemoval( + sequenceControlSetPtr, + pictureControlSetPtr->ParentPcsPtr, contextPtr); // Perform Budgetting @@ -1888,12 +1888,12 @@ static EB_ERRORTYPE SignalDerivationModeDecisionConfigKernelOq( EB_ERRORTYPE return_error = EB_ErrorNone; contextPtr->adpLevel = pictureControlSetPtr->ParentPcsPtr->encMode; - + // Derive chroma Qp Offset - // 0 : 2 Layer1 0 OW + // 0 : 2 Layer1 0 OW // 1 : MOD_QP_OFFSET -3 contextPtr->chromaQpOffsetLevel = 1; - + return return_error; } @@ -1916,18 +1916,18 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) EbObjectWrapper_t *encDecTasksWrapperPtr; EncDecTasks_t *encDecTasksPtr; EB_U32 pictureWidthInLcu; - EB_U32 pictureHeightInLcu; + EB_U32 pictureHeightInLcu; for(;;) { - // Get RateControl Results - EbGetFullObject( - contextPtr->rateControlInputFifoPtr, - &rateControlResultsWrapperPtr); + // Get RateControl Results + EbGetFullObject( + contextPtr->rateControlInputFifoPtr, + &rateControlResultsWrapperPtr); EB_CHECK_END_OBJ(rateControlResultsWrapperPtr); - rateControlResultsPtr = (RateControlResults_t*)rateControlResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureControlSet_t*)rateControlResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + rateControlResultsPtr = (RateControlResults_t*)rateControlResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureControlSet_t*)rateControlResultsPtr->pictureControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld MDC IN \n", pictureControlSetPtr->pictureNumber); #endif @@ -1935,14 +1935,14 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) pictureControlSetPtr, contextPtr); - pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; contextPtr->qp = pictureControlSetPtr->pictureQp; - pictureControlSetPtr->ParentPcsPtr->averageQp = 0; + pictureControlSetPtr->ParentPcsPtr->averageQp = 0; - pictureControlSetPtr->intraCodedArea = 0; + pictureControlSetPtr->intraCodedArea = 0; pictureControlSetPtr->sceneCaracteristicId = EB_FRAME_CARAC_0; @@ -1955,13 +1955,13 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture <= 35) && (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH) && (pictureControlSetPtr->ParentPcsPtr->picHomogenousOverTimeLcuPercentage < 50)) ? EB_FRAME_CARAC_1 : pictureControlSetPtr->sceneCaracteristicId; - + pictureControlSetPtr->sceneCaracteristicId = ( - (pictureControlSetPtr->ParentPcsPtr->isPan) && - (!pictureControlSetPtr->ParentPcsPtr->isTilt) && - (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 35) && - (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture <= 70) && - (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH) && + (pictureControlSetPtr->ParentPcsPtr->isPan) && + (!pictureControlSetPtr->ParentPcsPtr->isTilt) && + (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 35) && + (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture <= 70) && + (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH) && (pictureControlSetPtr->ParentPcsPtr->picHomogenousOverTimeLcuPercentage < 50)) ? EB_FRAME_CARAC_2 : pictureControlSetPtr->sceneCaracteristicId; pictureControlSetPtr->adjustMinQPFlag = (EB_BOOL)((!pictureControlSetPtr->ParentPcsPtr->isPan) && @@ -1973,29 +1973,29 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH)); - // Aura Detection - // Still is using the picture QP to derive aura thresholds, there fore it could not move to the open loop - AuraDetection( // HT done - sequenceControlSetPtr, - pictureControlSetPtr, - pictureWidthInLcu, - pictureHeightInLcu); + // Aura Detection + // Still is using the picture QP to derive aura thresholds, there fore it could not move to the open loop + AuraDetection( // HT done + sequenceControlSetPtr, + pictureControlSetPtr, + pictureWidthInLcu, + pictureHeightInLcu); - // Detect complex/non-flat/moving LCU in a non-complex area (used to refine MDC depth control) - DetectComplexNonFlatMovingLcu( // HT done + // Detect complex/non-flat/moving LCU in a non-complex area (used to refine MDC depth control) + DetectComplexNonFlatMovingLcu( // HT done sequenceControlSetPtr, - pictureControlSetPtr, - pictureWidthInLcu); + pictureControlSetPtr, + pictureWidthInLcu); - // Compute picture and slice level chroma QP offsets - SetSliceAndPictureChromaQpOffsets( // HT done + // Compute picture and slice level chroma QP offsets + SetSliceAndPictureChromaQpOffsets( // HT done pictureControlSetPtr, contextPtr); - // Compute Tc, and Beta offsets for a given picture - AdaptiveDlfParameterComputation( // HT done - contextPtr, - pictureControlSetPtr); + // Compute Tc, and Beta offsets for a given picture + AdaptiveDlfParameterComputation( // HT done + contextPtr, + pictureControlSetPtr); if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE) { @@ -2045,17 +2045,17 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) else if (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_LIGHT_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_PRED_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE) { // Predict the LCU partitionning - PerformEarlyLcuPartitionningLcu( // HT done + PerformEarlyLcuPartitionningLcu( // HT done contextPtr, sequenceControlSetPtr, pictureControlSetPtr, - lcuIndex); + lcuIndex); } } } else if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL85_DEPTH_MODE){ - Forward85CuToModeDecision( + Forward85CuToModeDecision( sequenceControlSetPtr, pictureControlSetPtr); } @@ -2068,13 +2068,13 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) else if (pictureControlSetPtr->ParentPcsPtr->depthMode >= PICT_OPEN_LOOP_DEPTH_MODE){ // Predict the LCU partitionning - PerformEarlyLcuPartitionning( // HT done + PerformEarlyLcuPartitionning( // HT done contextPtr, sequenceControlSetPtr, - pictureControlSetPtr); + pictureControlSetPtr); } else { // (pictureControlSetPtr->ParentPcsPtr->mdMode == PICT_BDP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->mdMode == PICT_LIGHT_BDP_DEPTH_MODE ) - pictureControlSetPtr->ParentPcsPtr->averageQp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; + pictureControlSetPtr->ParentPcsPtr->averageQp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; } #if DEADLOCK_DEBUG @@ -2119,7 +2119,7 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) // Release Rate Control Results EbReleaseObject(rateControlResultsWrapperPtr); - } + } - return EB_NULL; + return EB_NULL; } diff --git a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h index 37fa2aa8b..944c78624 100644 --- a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h +++ b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h @@ -19,16 +19,16 @@ extern "C" { * Defines **************************************/ -typedef struct MdcpLocalCodingUnit_s +typedef struct MdcpLocalCodingUnit_s { EB_U64 earlyCost; EB_BOOL earlySplitFlag; EB_U32 splitContext; - EB_BOOL slectedCu; + EB_BOOL slectedCu; EB_BOOL stopSplit; } MdcpLocalCodingUnit_t; -typedef struct ModeDecisionConfigurationContext_s +typedef struct ModeDecisionConfigurationContext_s { EbFifo_t *rateControlInputFifoPtr; EbFifo_t *modeDecisionConfigurationOutputFifoPtr; @@ -42,20 +42,20 @@ typedef struct ModeDecisionConfigurationContext_s // Inter depth decision EB_U8 groupOf8x8BlocksCount; EB_U8 groupOf16x16BlocksCount; - EB_U64 interComplexityMinimum; - EB_U64 interComplexityMaximum; - EB_U64 interComplexityAverage; - EB_U64 intraComplexityMinimum; - EB_U64 intraComplexityMaximum; - EB_U64 intraComplexityAverage; - EB_S16 minDeltaQpWeight; - EB_S16 maxDeltaQpWeight; - EB_S8 minDeltaQp[4]; - EB_S8 maxDeltaQp[4]; - - // Budgeting + EB_U64 interComplexityMinimum; + EB_U64 interComplexityMaximum; + EB_U64 interComplexityAverage; + EB_U64 intraComplexityMinimum; + EB_U64 intraComplexityMaximum; + EB_U64 intraComplexityAverage; + EB_S16 minDeltaQpWeight; + EB_S16 maxDeltaQpWeight; + EB_S8 minDeltaQp[4]; + EB_S8 maxDeltaQp[4]; + + // Budgeting EB_U32 *lcuScoreArray; - EB_U8 costDepthMode[LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE]; + EB_U8 costDepthMode[LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE]; EB_U8 *lcuCostArray; EB_U32 predictedCost; EB_U32 budget; @@ -85,11 +85,11 @@ extern EB_ERRORTYPE ModeDecisionConfigurationContextCtor( EbFifo_t *rateControlInputFifoPtr, EbFifo_t *modeDecisionConfigurationOutputFifoPtr, - EB_U16 lcuTotalCount); + EB_U16 lcuTotalCount); + - extern void* ModeDecisionConfigurationKernel(void *inputPtr); #ifdef __cplusplus } -#endif -#endif // EbModeDecisionConfigurationProcess_h \ No newline at end of file +#endif +#endif // EbModeDecisionConfigurationProcess_h diff --git a/Source/Lib/Codec/EbModeDecisionProcess.c b/Source/Lib/Codec/EbModeDecisionProcess.c index f5b0c5af2..120ac8b95 100644 --- a/Source/Lib/Codec/EbModeDecisionProcess.c +++ b/Source/Lib/Codec/EbModeDecisionProcess.c @@ -47,7 +47,7 @@ EB_ERRORTYPE ModeDecisionContextCtor( EB_MALLOC(ModeDecisionCandidate_t*, contextPtr->fastCandidateArray, sizeof(ModeDecisionCandidate_t) * MODE_DECISION_CANDIDATE_MAX_COUNT, EB_N_PTR); EB_MALLOC(ModeDecisionCandidate_t**, contextPtr->fastCandidatePtrArray, sizeof(ModeDecisionCandidate_t*) * MODE_DECISION_CANDIDATE_MAX_COUNT, EB_N_PTR); - + for(candidateIndex = 0; candidateIndex < MODE_DECISION_CANDIDATE_MAX_COUNT; ++candidateIndex) { contextPtr->fastCandidatePtrArray[candidateIndex] = &contextPtr->fastCandidateArray[candidateIndex]; contextPtr->fastCandidatePtrArray[candidateIndex]->mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; @@ -56,7 +56,7 @@ EB_ERRORTYPE ModeDecisionContextCtor( // Transform and Quantization Buffers EB_MALLOC(EbTransQuantBuffers_t*, contextPtr->transQuantBuffersPtr, sizeof(EbTransQuantBuffers_t), EB_N_PTR); - // Cabac cost + // Cabac cost EB_MALLOC(CabacCost_t*, contextPtr->CabacCost, sizeof(CabacCost_t), EB_N_PTR); return_error = EbTransQuantBuffersCtor( @@ -105,15 +105,15 @@ EB_ERRORTYPE ModeDecisionContextCtor( { EbPictureBufferDescInitData_t initData; - initData.bufferEnableMask = PICTURE_BUFFER_DESC_LUMA_MASK; + initData.bufferEnableMask = PICTURE_BUFFER_DESC_LUMA_MASK; initData.maxWidth = MAX_LCU_SIZE; initData.maxHeight = MAX_LCU_SIZE; initData.bitDepth = EB_8BIT; initData.colorFormat = EB_YUV420; - initData.leftPadding = 0; - initData.rightPadding = 0; - initData.topPadding = 0; - initData.botPadding = 0; + initData.leftPadding = 0; + initData.rightPadding = 0; + initData.topPadding = 0; + initData.botPadding = 0; initData.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( @@ -149,10 +149,10 @@ EB_ERRORTYPE ModeDecisionContextCtor( initData.maxHeight = MAX_LCU_SIZE; initData.bitDepth = EB_8BIT; initData.colorFormat = EB_YUV420; - initData.leftPadding = 0; - initData.rightPadding = 0; - initData.topPadding = 0; - initData.botPadding = 0; + initData.leftPadding = 0; + initData.rightPadding = 0; + initData.topPadding = 0; + initData.botPadding = 0; initData.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( @@ -199,30 +199,30 @@ static void ResetModeDecisionNeighborArrays(PictureControlSet_t *pictureControlS static void ResetMdRefinmentNeighborArrays(PictureControlSet_t *pictureControlSetPtr, EB_U32 tileIdx) { - NeighborArrayUnitReset(pictureControlSetPtr->mdRefinementIntraLumaModeNeighborArray[tileIdx]); - NeighborArrayUnitReset(pictureControlSetPtr->mdRefinementModeTypeNeighborArray[tileIdx]); + NeighborArrayUnitReset(pictureControlSetPtr->mdRefinementIntraLumaModeNeighborArray[tileIdx]); + NeighborArrayUnitReset(pictureControlSetPtr->mdRefinementModeTypeNeighborArray[tileIdx]); NeighborArrayUnitReset(pictureControlSetPtr->mdRefinementLumaReconNeighborArray[tileIdx]); - return; + return; } extern void lambdaAssignLowDelay( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 *fastLambda, - EB_U32 *fullLambda, - EB_U32 *fastChromaLambda, - EB_U32 *fullChromaLambda, - EB_U32 *fullChromaLambdaSao, - EB_U8 qp, - EB_U8 chromaQp) + EB_U32 *fastLambda, + EB_U32 *fullLambda, + EB_U32 *fastChromaLambda, + EB_U32 *fullChromaLambda, + EB_U32 *fullChromaLambdaSao, + EB_U8 qp, + EB_U8 chromaQp) { if (pictureControlSetPtr->temporalLayerIndex == 0) { - *fastLambda = lambdaModeDecisionLdSad[qp]; - *fastChromaLambda = lambdaModeDecisionLdSad[qp]; + *fastLambda = lambdaModeDecisionLdSad[qp]; + *fastChromaLambda = lambdaModeDecisionLdSad[qp]; *fullLambda = lambdaModeDecisionLdSse[qp]; *fullChromaLambda = lambdaModeDecisionLdSse[qp]; *fullChromaLambdaSao = lambdaModeDecisionLdSse[chromaQp]; @@ -230,8 +230,8 @@ extern void lambdaAssignLowDelay( } else { // Hierarchical postions 1, 2, 3, 4, 5 - *fastLambda = lambdaModeDecisionLdSadQpScaling[qp]; - *fastChromaLambda = lambdaModeDecisionLdSadQpScaling[qp]; + *fastLambda = lambdaModeDecisionLdSadQpScaling[qp]; + *fastChromaLambda = lambdaModeDecisionLdSadQpScaling[qp]; *fullLambda = lambdaModeDecisionLdSseQpScaling[qp]; *fullChromaLambda = lambdaModeDecisionLdSseQpScaling[qp]; *fullChromaLambdaSao = lambdaModeDecisionLdSseQpScaling[chromaQp]; @@ -241,13 +241,13 @@ extern void lambdaAssignLowDelay( void lambdaAssignRandomAccess( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 *fastLambda, - EB_U32 *fullLambda, - EB_U32 *fastChromaLambda, - EB_U32 *fullChromaLambda, - EB_U32 *fullChromaLambdaSao, - EB_U8 qp, - EB_U8 chromaQp) + EB_U32 *fastLambda, + EB_U32 *fullLambda, + EB_U32 *fastChromaLambda, + EB_U32 *fullChromaLambda, + EB_U32 *fullChromaLambdaSao, + EB_U8 qp, + EB_U8 chromaQp) { if (pictureControlSetPtr->temporalLayerIndex == 0) { @@ -280,20 +280,20 @@ void lambdaAssignRandomAccess( void lambdaAssignISlice( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 *fastLambda, - EB_U32 *fullLambda, - EB_U32 *fastChromaLambda, - EB_U32 *fullChromaLambda, - EB_U32 *fullChromaLambdaSao, - EB_U8 qp, - EB_U8 chromaQp) + EB_U32 *fastLambda, + EB_U32 *fullLambda, + EB_U32 *fastChromaLambda, + EB_U32 *fullChromaLambda, + EB_U32 *fullChromaLambdaSao, + EB_U8 qp, + EB_U8 chromaQp) { if (pictureControlSetPtr->temporalLayerIndex == 0) { - *fastLambda = lambdaModeDecisionISliceSad[qp]; - *fastChromaLambda = lambdaModeDecisionISliceSad[qp]; + *fastLambda = lambdaModeDecisionISliceSad[qp]; + *fastChromaLambda = lambdaModeDecisionISliceSad[qp]; *fullLambda = lambdaModeDecisionISliceSse[qp]; *fullChromaLambda = lambdaModeDecisionISliceSse[qp]; *fullChromaLambdaSao = lambdaModeDecisionISliceSse[chromaQp]; @@ -305,10 +305,10 @@ void lambdaAssignISlice( } const EB_LAMBDA_ASSIGN_FUNC lambdaAssignmentFunctionTable[4] = { - lambdaAssignLowDelay, // low delay P - lambdaAssignLowDelay, // low delay B - lambdaAssignRandomAccess, // Random Access - lambdaAssignISlice // I_SLICE + lambdaAssignLowDelay, // low delay P + lambdaAssignLowDelay, // low delay B + lambdaAssignRandomAccess, // Random Access + lambdaAssignISlice // I_SLICE }; void ProductResetModeDecision( @@ -318,98 +318,98 @@ void ProductResetModeDecision( EB_U32 tileRowIndex, EB_U32 segmentIndex) { - EB_PICTURE sliceType; - EB_U32 lcuRowIndex; - MdRateEstimationContext_t *mdRateEstimationArray; - - // SAO - pictureControlSetPtr->saoFlag[0] = EB_TRUE; - pictureControlSetPtr->saoFlag[1] = EB_TRUE; + EB_PICTURE sliceType; + EB_U32 lcuRowIndex; + MdRateEstimationContext_t *mdRateEstimationArray; - // QP - contextPtr->qp = pictureControlSetPtr->pictureQp; - // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation + // SAO + pictureControlSetPtr->saoFlag[0] = EB_TRUE; + pictureControlSetPtr->saoFlag[1] = EB_TRUE; - EB_U8 qpScaled = CLIP3(MIN_QP_VALUE, MAX_CHROMA_MAP_QP_VALUE, (EB_S32)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); - contextPtr->chromaQp = MapChromaQp(qpScaled); + // QP + contextPtr->qp = pictureControlSetPtr->pictureQp; + // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - if (pictureControlSetPtr->sliceType == EB_I_PICTURE && pictureControlSetPtr->temporalId == 0){ + EB_U8 qpScaled = CLIP3(MIN_QP_VALUE, MAX_CHROMA_MAP_QP_VALUE, (EB_S32)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + contextPtr->chromaQp = MapChromaQp(qpScaled); - (*lambdaAssignmentFunctionTable[3])( + if (pictureControlSetPtr->sliceType == EB_I_PICTURE && pictureControlSetPtr->temporalId == 0){ + + (*lambdaAssignmentFunctionTable[3])( pictureControlSetPtr->ParentPcsPtr, - &contextPtr->fastLambda, - &contextPtr->fullLambda, - &contextPtr->fastChromaLambda, - &contextPtr->fullChromaLambda, - &contextPtr->fullChromaLambdaSao, - contextPtr->qp, - contextPtr->chromaQp); - } - else{ - (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( + &contextPtr->fastLambda, + &contextPtr->fullLambda, + &contextPtr->fastChromaLambda, + &contextPtr->fullChromaLambda, + &contextPtr->fullChromaLambdaSao, + contextPtr->qp, + contextPtr->chromaQp); + } + else{ + (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( pictureControlSetPtr->ParentPcsPtr, - &contextPtr->fastLambda, - &contextPtr->fullLambda, - &contextPtr->fastChromaLambda, - &contextPtr->fullChromaLambda, - &contextPtr->fullChromaLambdaSao, - contextPtr->qp, - contextPtr->chromaQp); - } - // Configure the number of candidate buffers to search at each depth + &contextPtr->fastLambda, + &contextPtr->fullLambda, + &contextPtr->fastChromaLambda, + &contextPtr->fullChromaLambda, + &contextPtr->fullChromaLambdaSao, + contextPtr->qp, + contextPtr->chromaQp); + } + // Configure the number of candidate buffers to search at each depth // 64x64 CU contextPtr->bufferDepthIndexStart[0] = 0; - contextPtr->bufferDepthIndexWidth[0] = 5; // 4 NFL + 1 for temporary data + contextPtr->bufferDepthIndexWidth[0] = 5; // 4 NFL + 1 for temporary data // 32x32 CU contextPtr->bufferDepthIndexStart[1] = contextPtr->bufferDepthIndexStart[0] + contextPtr->bufferDepthIndexWidth[0]; - contextPtr->bufferDepthIndexWidth[1] = 8; // 4 NFL + 3 MPM + 1 for temporary data + contextPtr->bufferDepthIndexWidth[1] = 8; // 4 NFL + 3 MPM + 1 for temporary data // 16x16 CU contextPtr->bufferDepthIndexStart[2] = contextPtr->bufferDepthIndexStart[1] + contextPtr->bufferDepthIndexWidth[1]; - contextPtr->bufferDepthIndexWidth[2] = 8; // 4 NFL + 3 MPM + 1 for temporary data + contextPtr->bufferDepthIndexWidth[2] = 8; // 4 NFL + 3 MPM + 1 for temporary data // 8x8 CU contextPtr->bufferDepthIndexStart[3] = contextPtr->bufferDepthIndexStart[2] + contextPtr->bufferDepthIndexWidth[2]; - contextPtr->bufferDepthIndexWidth[3] = 8; // 4 NFL + 3 MPM + 1 for temporary data + contextPtr->bufferDepthIndexWidth[3] = 8; // 4 NFL + 3 MPM + 1 for temporary data // 4x4 CU contextPtr->bufferDepthIndexStart[4] = contextPtr->bufferDepthIndexStart[3] + contextPtr->bufferDepthIndexWidth[3]; - contextPtr->bufferDepthIndexWidth[4] = 5; // 4 NFL + 1 for temporary data + contextPtr->bufferDepthIndexWidth[4] = 5; // 4 NFL + 1 for temporary data - // Slice Type - sliceType = - (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : - pictureControlSetPtr->sliceType; + // Slice Type + sliceType = + (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : + pictureControlSetPtr->sliceType; - // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type + // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type - /* Note(CHKN) : Rate estimation will use FrameQP even when Qp modulation is ON */ + /* Note(CHKN) : Rate estimation will use FrameQP even when Qp modulation is ON */ - mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; - mdRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; + mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; + mdRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; - // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray - contextPtr->mdRateEstimationPtr = mdRateEstimationArray; + // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray + contextPtr->mdRateEstimationPtr = mdRateEstimationArray; - EB_U32 candidateIndex; - for (candidateIndex = 0; candidateIndex < MODE_DECISION_CANDIDATE_MAX_COUNT; ++candidateIndex) { - contextPtr->fastCandidatePtrArray[candidateIndex]->mdRateEstimationPtr = mdRateEstimationArray; - } + EB_U32 candidateIndex; + for (candidateIndex = 0; candidateIndex < MODE_DECISION_CANDIDATE_MAX_COUNT; ++candidateIndex) { + contextPtr->fastCandidatePtrArray[candidateIndex]->mdRateEstimationPtr = mdRateEstimationArray; + } - // TMVP Map Writer Pointer - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr; - else - contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)EB_NULL; + // TMVP Map Writer Pointer + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr; + else + contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)EB_NULL; - // Reset CABAC Contexts - contextPtr->coeffEstEntropyCoderPtr = pictureControlSetPtr->coeffEstEntropyCoderPtr; + // Reset CABAC Contexts + contextPtr->coeffEstEntropyCoderPtr = pictureControlSetPtr->coeffEstEntropyCoderPtr; - // Reset Neighbor Arrays at start of new Segment / Picture + // Reset Neighbor Arrays at start of new Segment / Picture // Jing: Current segments will cross tiles - if (segmentIndex == 0) { + if (segmentIndex == 0) { for (unsigned int tileIdx = tileRowIndex * pictureControlSetPtr->ParentPcsPtr->tileColumnCount; tileIdx < (tileRowIndex + 1) * pictureControlSetPtr->ParentPcsPtr->tileColumnCount; tileIdx++) { @@ -424,14 +424,14 @@ void ProductResetModeDecision( } } - } + } - return; + return; } void ConfigureChroma( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr) { EB_U32 lcuAddr = lcuPtr->index; @@ -445,7 +445,7 @@ void ConfigureChroma( EB_BOOL chromaCond2 = !lcuStatPtr->cuStatArray[0].highLuma; EB_BOOL chromaCond3 = ((pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 60) || (lcuPtr->auraStatus == AURA_STATUS_1) || (pictureControlSetPtr->ParentPcsPtr->isPan)); - // 0: Full Search Chroma for All + // 0: Full Search Chroma for All // 1: Best Search Chroma for All LCUs; Chroma OFF if I_SLICE, Chroma for only MV_Merge if P/B_SLICE // 2: Full vs. Best Swicth Method 0: chromaCond0 || chromaCond1 || chromaCond2 // 3: Full vs. Best Swicth Method 1: chromaCond0 || chromaCond1 @@ -500,8 +500,8 @@ void ConfigureChroma( void DeriveIntraInterBiasFlag( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr) { @@ -546,8 +546,8 @@ void DeriveIntraInterBiasFlag( } void ProductConfigurePicLcuMdDetectors( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr) { @@ -598,7 +598,7 @@ void ProductConfigurePicLcuMdDetectors( void ConfigureMpm( - ModeDecisionContext_t *contextPtr) + ModeDecisionContext_t *contextPtr) { if (contextPtr->restrictIntraGlobalMotion) { contextPtr->mpmSearch = EB_FALSE; @@ -629,9 +629,9 @@ void DeriveIntra4x4SearchMethod( if (pictureControlSetPtr->ParentPcsPtr->lcuFlatNoiseArray[lcuPtr->index] == EB_FALSE) { // Set INTRA4x4 Search Level - // Level Settings - // 0 INLINE if not BDP, refinment otherwise - // 1 REFINMENT + // Level Settings + // 0 INLINE if not BDP, refinment otherwise + // 1 REFINMENT // 2 OFF if (contextPtr->intra4x4Level == 0) { if ((pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL85_DEPTH_MODE || @@ -667,12 +667,12 @@ void DeriveDepthRefinment( EB_U32 lcuAddr = lcuPtr->index; LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuAddr]); - + EB_U8 stationaryEdgeOverTimeFlag = lcuStatPtr->stationaryEdgeOverTimeFlag; contextPtr->depthRefinment = 0; - // S-LOGO + // S-LOGO if (stationaryEdgeOverTimeFlag > 0) { if (lcuStatPtr->lowDistLogo) contextPtr->depthRefinment = 1; @@ -714,7 +714,7 @@ void ModeDecisionConfigureLcu( pictureControlSetPtr, contextPtr, lcuPtr); - + // Load MPM Settings ConfigureMpm( contextPtr); @@ -736,19 +736,19 @@ void ModeDecisionConfigureLcu( contextPtr, lcuPtr); - if (sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->staticConfig.improveSharpness == 0) { - contextPtr->qp = (EB_U8)pictureQp; + if (sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->staticConfig.improveSharpness == 0) { + contextPtr->qp = (EB_U8)pictureQp; lcuPtr->qp = (EB_U8)contextPtr->qp; } //RC is on else { - contextPtr->qp = (EB_U8) lcuQp; + contextPtr->qp = (EB_U8) lcuQp; } - // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation + // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); - contextPtr->chromaQp = MapChromaQp(qpScaled); + EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + contextPtr->chromaQp = MapChromaQp(qpScaled); /* Note(CHKN) : when Qp modulation varies QP on a sub-LCU(CU) basis, Lamda has to change based on Cu->QP , and then this code has to move inside the CU loop in MD */ @@ -767,17 +767,17 @@ void ModeDecisionConfigureLcu( } else{ - // Change lambda QP for 4K 5L and 6L - EB_U8 lambdaQp = contextPtr->qp; + // Change lambda QP for 4K 5L and 6L + EB_U8 lambdaQp = contextPtr->qp; - (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( + (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( pictureControlSetPtr->ParentPcsPtr, &contextPtr->fastLambda, &contextPtr->fullLambda, &contextPtr->fastChromaLambda, &contextPtr->fullChromaLambda, &contextPtr->fullChromaLambdaSao, - lambdaQp, + lambdaQp, contextPtr->chromaQp); } diff --git a/Source/Lib/Codec/EbModeDecisionProcess.h b/Source/Lib/Codec/EbModeDecisionProcess.h index 19c1e6dc3..bf50e49bd 100644 --- a/Source/Lib/Codec/EbModeDecisionProcess.h +++ b/Source/Lib/Codec/EbModeDecisionProcess.h @@ -60,12 +60,12 @@ typedef struct MDEncPassCuData_s EB_S16 yDc[4];// Store the ABS of DC values per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 EB_U16 yCountNonZeroCoeffs[4];// Store nonzero CoeffNum, per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 -} MDEncPassCuData_t; +} MDEncPassCuData_t; typedef struct LcuBasedDetectors_s { unsigned intraInterCond1 : 1; // intra / inter bias unsigned intraInterCond2 : 1; // intra / inter bias - unsigned intraInterCond3 : 1; // intra / inter bias + unsigned intraInterCond3 : 1; // intra / inter bias unsigned intraInterCond4 : 1; unsigned biPredCond1 : 1; // FastLoop @@ -75,123 +75,123 @@ typedef struct LcuBasedDetectors_s typedef struct MdCodingUnit_s { - unsigned testedCuFlag : 1; //tells whether this CU is tested in MD. - unsigned mdcArrayIndex : 7; - unsigned countNonZeroCoeffs : 11; - unsigned topNeighborDepth : 2; - unsigned leftNeighborDepth : 2; - unsigned topNeighborMode : 2; - unsigned leftNeighborMode : 2; - unsigned fullDistortion : 32; - unsigned chromaDistortion : 32; - unsigned chromaDistortionInterDepth : 32; - EB_U64 cost; - EB_U64 costLuma; + unsigned testedCuFlag : 1; //tells whether this CU is tested in MD. + unsigned mdcArrayIndex : 7; + unsigned countNonZeroCoeffs : 11; + unsigned topNeighborDepth : 2; + unsigned leftNeighborDepth : 2; + unsigned topNeighborMode : 2; + unsigned leftNeighborMode : 2; + unsigned fullDistortion : 32; + unsigned chromaDistortion : 32; + unsigned chromaDistortionInterDepth : 32; + EB_U64 cost; + EB_U64 costLuma; }MdCodingUnit_t; typedef struct ModeDecisionContext_s { - EbFifo_t *modeDecisionConfigurationInputFifoPtr; - EbFifo_t *modeDecisionOutputFifoPtr; + EbFifo_t *modeDecisionConfigurationInputFifoPtr; + EbFifo_t *modeDecisionOutputFifoPtr; - EB_S16 *transformInnerArrayPtr; + EB_S16 *transformInnerArrayPtr; - ModeDecisionCandidate_t **fastCandidatePtrArray; - ModeDecisionCandidate_t *fastCandidateArray; + ModeDecisionCandidate_t **fastCandidatePtrArray; + ModeDecisionCandidate_t *fastCandidateArray; // TMVP - EbReferenceObject_t *referenceObjectWritePtr; + EbReferenceObject_t *referenceObjectWritePtr; // Coding Unit Workspace--------------------------- - EbPictureBufferDesc_t *predictionBuffer; + EbPictureBufferDesc_t *predictionBuffer; // Intra Reference Samples - IntraReferenceSamples_t *intraRefPtr; + IntraReferenceSamples_t *intraRefPtr; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - InterPredictionContext_t *interPredictionContext; + InterPredictionContext_t *interPredictionContext; - MdRateEstimationContext_t *mdRateEstimationPtr; + MdRateEstimationContext_t *mdRateEstimationPtr; - SaoStats_t *saoStats; + SaoStats_t *saoStats; // Transform and Quantization Buffers - EbTransQuantBuffers_t *transQuantBuffersPtr; + EbTransQuantBuffers_t *transQuantBuffersPtr; // MCP Context - MotionCompensationPredictionContext_t *mcpContext; + MotionCompensationPredictionContext_t *mcpContext; struct EncDecContext_s *encDecContextPtr; - EB_U64 *fastCostArray; - EB_U64 *fullCostArray; - EB_U64 *fullCostSkipPtr; - EB_U64 *fullCostMergePtr; + EB_U64 *fastCostArray; + EB_U64 *fullCostArray; + EB_U64 *fullCostSkipPtr; + EB_U64 *fullCostMergePtr; - - // Fast loop buffers - EB_U8 bufferDepthIndexStart[MAX_LEVEL_COUNT]; - EB_U8 bufferDepthIndexWidth[MAX_LEVEL_COUNT]; - // Lambda - EB_U8 qp; - EB_U8 chromaQp; - EB_U32 fastLambda; - EB_U32 fullLambda; - EB_U32 fastChromaLambda; - EB_U32 fullChromaLambda; - EB_U32 fullChromaLambdaSao; - - // Context Variables--------------------------------- + // Fast loop buffers + EB_U8 bufferDepthIndexStart[MAX_LEVEL_COUNT]; + EB_U8 bufferDepthIndexWidth[MAX_LEVEL_COUNT]; + + // Lambda + EB_U8 qp; + EB_U8 chromaQp; + EB_U32 fastLambda; + EB_U32 fullLambda; + EB_U32 fastChromaLambda; + EB_U32 fullChromaLambda; + EB_U32 fullChromaLambdaSao; + + // Context Variables--------------------------------- LargestCodingUnit_t *lcuPtr; TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStats; + const TransformUnitStats_t *tuStats; CodingUnit_t *cuPtr; - const CodedUnitStats_t *cuStats; + const CodedUnitStats_t *cuStats; PredictionUnit_t *puPtr; - const PredictionUnitStats_t *puStats; + const PredictionUnitStats_t *puStats; MvUnit_t mvUnit; - MvMergeCandidate_t mergeCandidateArray[MAX_NUM_OF_MV_MERGE_CANDIDATE]; + MvMergeCandidate_t mergeCandidateArray[MAX_NUM_OF_MV_MERGE_CANDIDATE]; // Inter depth decision EB_U8 mpmSearchCandidate; - EB_U8 groupOf8x8BlocksCount; - EB_U8 groupOf16x16BlocksCount; + EB_U8 groupOf8x8BlocksCount; + EB_U8 groupOf16x16BlocksCount; EB_U8 puItr; EB_U8 cuSizeLog2; EB_U8 amvpCandidateCountRefList0; - EB_U8 amvpCandidateCountRefList1; + EB_U8 amvpCandidateCountRefList1; + + EB_U8 bestCandidateIndexArray[MAX_FULL_LOOP_CANIDATES_PER_DEPTH]; - EB_U8 bestCandidateIndexArray[MAX_FULL_LOOP_CANIDATES_PER_DEPTH]; + EB_U16 cuOriginX; + EB_U16 cuOriginY; + EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_U16 cuOriginX; - EB_U16 cuOriginY; - EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - - EB_U32 mostProbableModeArray[MAX_MPM_CANDIDATES]; - EB_U32 useChromaInformationInFastLoop; + EB_U32 mostProbableModeArray[MAX_MPM_CANDIDATES]; + EB_U32 useChromaInformationInFastLoop; EB_BOOL useChromaInformationInFullLoop; EB_U8 cuDepth; - EB_U8 cuSize; - EB_U8 lcuSize; - EB_U8 lcuChromaSize; - EB_U16 cuChromaOriginX; - EB_U16 cuChromaOriginY; + EB_U8 cuSize; + EB_U8 lcuSize; + EB_U8 lcuChromaSize; + EB_U16 cuChromaOriginX; + EB_U16 cuChromaOriginY; EB_U16 puOriginX; - EB_U16 puOriginY; + EB_U16 puOriginY; EB_U16 puWidth; - EB_U16 puHeight; + EB_U16 puHeight; - EB_PF_MODE pfMdMode; + EB_PF_MODE pfMdMode; EB_BOOL mpmSearch; EB_BOOL useIntraInterBias; @@ -203,11 +203,11 @@ typedef struct ModeDecisionContext_s EB_U8 intraLumaTopModeArray[4]; // Entropy Coder - EntropyCoder_t *coeffEstEntropyCoderPtr; - CabacCost_t *CabacCost; + EntropyCoder_t *coeffEstEntropyCoderPtr; + CabacCost_t *CabacCost; SyntaxContextModelEncContext_t syntaxCabacCtxModelArray; - MDEncPassCuData_t mdEpPipeLcu[CU_MAX_COUNT]; + MDEncPassCuData_t mdEpPipeLcu[CU_MAX_COUNT]; LcuBasedDetectors_t *mdPicLcuDetect; EbPictureBufferDesc_t *pillarReconBuffer; @@ -221,33 +221,33 @@ typedef struct ModeDecisionContext_s NeighborArrayUnit_t *skipFlagNeighborArray; NeighborArrayUnit_t *modeTypeNeighborArray; NeighborArrayUnit_t *leafDepthNeighborArray; - NeighborArrayUnit_t *lumaReconNeighborArray; + NeighborArrayUnit_t *lumaReconNeighborArray; NeighborArrayUnit_t *cbReconNeighborArray; NeighborArrayUnit_t *crReconNeighborArray; - + BdpCuData_t pillarCuArray; EB_BOOL cu8x8RefinementOnFlag; EB_BOOL depthRefinment ; EB_BOOL conformantMvMergeTable; - - EB_BOOL edgeBlockNumFlag; - MdCodingUnit_t mdLocalCuUnit[CU_MAX_COUNT]; - EB_BOOL cuUseRefSrcFlag; - EB_BOOL restrictIntraGlobalMotion; + + EB_BOOL edgeBlockNumFlag; + MdCodingUnit_t mdLocalCuUnit[CU_MAX_COUNT]; + EB_BOOL cuUseRefSrcFlag; + EB_BOOL restrictIntraGlobalMotion; EB_U8 interpolationMethod; EB_BOOL coeffCabacUpdate; CoeffCtxtMdl_t latestValidCoeffCtxModel; //tracks the best CU partition so far CoeffCtxtMdl_t i4x4CoeffCtxModel; - EB_BOOL use4x4ChromaInformationInFullLoop; + EB_BOOL use4x4ChromaInformationInFullLoop; - // Multi-modes signal(s) + // Multi-modes signal(s) EB_U8 intraInjectionMethod; EB_BOOL spatialSseFullLoop; EB_BOOL intra8x8RestrictionInterSlice; EB_BOOL generateAmvpTableMd; - EB_BOOL fullLoopEscape; + EB_BOOL fullLoopEscape; EB_BOOL singleFastLoopFlag; EB_BOOL amvpInjection; EB_BOOL unipred3x3Injection; @@ -300,8 +300,8 @@ extern EB_ERRORTYPE ModeDecisionContextCtor( extern void ApplyIntraInterModeBias( EB_BOOL intraInterCond1, EB_BOOL intraInterCond2, - EB_BOOL intraInterCond3, - EB_U64 *fullCostPtr); + EB_BOOL intraInterCond3, + EB_U64 *fullCostPtr); extern const EB_LAMBDA_ASSIGN_FUNC lambdaAssignmentFunctionTable[4]; diff --git a/Source/Lib/Codec/EbModeDecisionSegments.h b/Source/Lib/Codec/EbModeDecisionSegments.h index ce8d718fd..57f4e69f7 100644 --- a/Source/Lib/Codec/EbModeDecisionSegments.h +++ b/Source/Lib/Codec/EbModeDecisionSegments.h @@ -18,11 +18,11 @@ typedef struct { EB_U64 completionMask; EB_HANDLE writeLockMutex; - + EB_U32 totalCount; EB_U32 columnCount; EB_U32 rowCount; - + EB_BOOL inProgress; EB_U32 currentRowIdx; @@ -40,4 +40,4 @@ extern void ModeDecisionSegmentsDtor( #ifdef __cplusplus } #endif -#endif // EbModeDecisionSegments_h \ No newline at end of file +#endif // EbModeDecisionSegments_h diff --git a/Source/Lib/Codec/EbMotionEstimation.h b/Source/Lib/Codec/EbMotionEstimation.h index 3945e5c3e..ef99139df 100644 --- a/Source/Lib/Codec/EbMotionEstimation.h +++ b/Source/Lib/Codec/EbMotionEstimation.h @@ -19,7 +19,7 @@ extern "C" { #endif extern EB_ERRORTYPE MotionEstimateLcu( - PictureParentControlSet_t *pictureControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuIndex, EB_U32 lcuOriginX, EB_U32 lcuOriginY, @@ -27,10 +27,10 @@ extern EB_ERRORTYPE MotionEstimateLcu( EbPictureBufferDesc_t *inputPtr); extern EB_ERRORTYPE OpenLoopIntraCandidateSearchLcu( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr); + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr); extern void Decimation2D( EB_U8 *inputSamples, @@ -42,20 +42,20 @@ extern void Decimation2D( EB_U32 decimStep); extern EB_ERRORTYPE OpenLoopIntraSearchLcu( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr); + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr); extern void GetMv( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv); + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv); extern void GetMeDist( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, EB_U32 *distortion); EB_S8 Sort3Elements(EB_U32 a, EB_U32 b, EB_U32 c); @@ -69,4 +69,4 @@ EB_S8 Sort3Elements(EB_U32 a, EB_U32 b, EB_U32 c); #ifdef __cplusplus } #endif -#endif // EbMotionEstimation_h \ No newline at end of file +#endif // EbMotionEstimation_h diff --git a/Source/Lib/Codec/EbMotionEstimationContext.c b/Source/Lib/Codec/EbMotionEstimationContext.c index 6fc326239..d919ade5d 100644 --- a/Source/Lib/Codec/EbMotionEstimationContext.c +++ b/Source/Lib/Codec/EbMotionEstimationContext.c @@ -42,24 +42,24 @@ EB_ERRORTYPE MeContextCtor( // Intermediate LCU-sized buffer to retain the input samples (*objectDblPtr)->lcuBufferStride = MAX_LCU_SIZE; EB_ALLIGN_MALLOC(EB_U8 *, (*objectDblPtr)->lcuBuffer, sizeof(EB_U8) * MAX_LCU_SIZE * (*objectDblPtr)->lcuBufferStride, EB_A_PTR); - + (*objectDblPtr)->hmeLcuBufferStride = (MAX_LCU_SIZE + HME_DECIM_FILTER_TAP - 1); EB_MALLOC(EB_U8 *, (*objectDblPtr)->hmeLcuBuffer, sizeof(EB_U8) * (MAX_LCU_SIZE + HME_DECIM_FILTER_TAP - 1) * (*objectDblPtr)->hmeLcuBufferStride, EB_N_PTR); - + (*objectDblPtr)->quarterLcuBufferStride = (MAX_LCU_SIZE >> 1); EB_MALLOC(EB_U8 *, (*objectDblPtr)->quarterLcuBuffer, sizeof(EB_U8) * (MAX_LCU_SIZE >> 1) * (*objectDblPtr)->quarterLcuBufferStride, EB_N_PTR); (*objectDblPtr)->sixteenthLcuBufferStride = (MAX_LCU_SIZE >> 2); EB_ALLIGN_MALLOC(EB_U8 *, (*objectDblPtr)->sixteenthLcuBuffer, sizeof(EB_U8) * (MAX_LCU_SIZE >> 2) * (*objectDblPtr)->sixteenthLcuBufferStride, EB_A_PTR); - + (*objectDblPtr)->interpolatedStride = MAX_SEARCH_AREA_WIDTH; EB_MALLOC(EB_U8 *, (*objectDblPtr)->hmeBuffer, sizeof(EB_U8) * (*objectDblPtr)->interpolatedStride * MAX_SEARCH_AREA_HEIGHT, EB_N_PTR); - + (*objectDblPtr)->hmeBufferStride = MAX_SEARCH_AREA_WIDTH; EB_MEMSET((*objectDblPtr)->lcuBuffer, 0 , sizeof(EB_U8) * MAX_LCU_SIZE * (*objectDblPtr)->lcuBufferStride); EB_MEMSET((*objectDblPtr)->hmeLcuBuffer, 0 ,sizeof(EB_U8) * (MAX_LCU_SIZE + HME_DECIM_FILTER_TAP - 1) * (*objectDblPtr)->hmeLcuBufferStride); - EB_MALLOC(EB_BitFraction *, (*objectDblPtr)->mvdBitsArray, sizeof(EB_BitFraction) * NUMBER_OF_MVD_CASES, EB_N_PTR); + EB_MALLOC(EB_BitFraction *, (*objectDblPtr)->mvdBitsArray, sizeof(EB_BitFraction) * NUMBER_OF_MVD_CASES, EB_N_PTR); // 15 intermediate buffers to retain the interpolated reference samples // 0 1 2 3 @@ -106,21 +106,21 @@ EB_ERRORTYPE MeContextCtor( for( refPicIndex = 0; refPicIndex < MAX_REF_IDX; refPicIndex++) { EB_MALLOC(EB_U8 *, (*objectDblPtr)->integerBuffer[listIndex][refPicIndex], sizeof(EB_U8) * (*objectDblPtr)->interpolatedStride * MAX_SEARCH_AREA_HEIGHT, EB_N_PTR); - + EB_MALLOC(EB_U8 *, (*objectDblPtr)->posbBuffer[listIndex][refPicIndex], sizeof(EB_U8) * (*objectDblPtr)->interpolatedStride * MAX_SEARCH_AREA_HEIGHT, EB_N_PTR); - + EB_MALLOC(EB_U8 *, (*objectDblPtr)->poshBuffer[listIndex][refPicIndex], sizeof(EB_U8) * (*objectDblPtr)->interpolatedStride * MAX_SEARCH_AREA_HEIGHT, EB_N_PTR); - + EB_MALLOC(EB_U8 *, (*objectDblPtr)->posjBuffer[listIndex][refPicIndex], sizeof(EB_U8) * (*objectDblPtr)->interpolatedStride * MAX_SEARCH_AREA_HEIGHT, EB_N_PTR); - + } } EB_MALLOC(EB_BYTE, (*objectDblPtr)->oneDIntermediateResultsBuf0, sizeof(EB_U8)*MAX_LCU_SIZE*MAX_LCU_SIZE, EB_N_PTR); - + EB_MALLOC(EB_BYTE, (*objectDblPtr)->oneDIntermediateResultsBuf1, sizeof(EB_U8)*MAX_LCU_SIZE*MAX_LCU_SIZE, EB_N_PTR); - + for(puIndex= 0; puIndex < MAX_ME_PU_COUNT; puIndex++) { for( meCandidateIndex = 0; meCandidateIndex < MAX_ME_CANDIDATE_PER_PU; meCandidateIndex++) { MotionEstimetionPredUnitCtor(&((*objectDblPtr)->meCandidate[meCandidateIndex]).pu[puIndex]); @@ -128,8 +128,8 @@ EB_ERRORTYPE MeContextCtor( } EB_MALLOC(EB_U8 *, (*objectDblPtr)->avctempBuffer, sizeof(EB_U8) * (*objectDblPtr)->interpolatedStride * MAX_SEARCH_AREA_HEIGHT, EB_N_PTR); - + EB_MALLOC(EB_U16 *, (*objectDblPtr)->pEightPosSad16x16, sizeof(EB_U16) * 8 * 16, EB_N_PTR);//16= 16 16x16 blocks in a LCU. 8=8search points - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbMotionEstimationContext.h b/Source/Lib/Codec/EbMotionEstimationContext.h index 83d3ddaad..bef0814cc 100644 --- a/Source/Lib/Codec/EbMotionEstimationContext.h +++ b/Source/Lib/Codec/EbMotionEstimationContext.h @@ -26,7 +26,7 @@ extern "C" { #define MEAN_PRECISION (VARIANCE_PRECISION >> 1) #define HME_RECTANGULAR 0 -#define HME_SPARSE 1 +#define HME_SPARSE 1 // Quater pel refinement methods typedef enum EB_QUARTER_PEL_REFINEMENT_METHOD { @@ -135,7 +135,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_8x8_61 = 82, ME_TIER_ZERO_PU_8x8_62 = 83, ME_TIER_ZERO_PU_8x8_63 = 84, - // 2NxN [42 partitions] + // 2NxN [42 partitions] ME_TIER_ZERO_PU_64x32_0 = 85, ME_TIER_ZERO_PU_64x32_1 = 86, ME_TIER_ZERO_PU_32x16_0 = 87, @@ -178,7 +178,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_16x8_29 = 124, ME_TIER_ZERO_PU_16x8_30 = 125, ME_TIER_ZERO_PU_16x8_31 = 126, - // Nx2N [42 partitions] + // Nx2N [42 partitions] ME_TIER_ZERO_PU_32x64_0 = 127, ME_TIER_ZERO_PU_32x64_1 = 128, ME_TIER_ZERO_PU_16x32_0 = 129, @@ -222,7 +222,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_8x16_30 = 167, ME_TIER_ZERO_PU_8x16_31 = 168, - // 2NxnU [10 partitions] + // 2NxnU [10 partitions] ME_TIER_ZERO_PU_64x16_0 = 169, ME_TIER_ZERO_PU_64x16_1 = 170, ME_TIER_ZERO_PU_32x8_0 = 171, @@ -233,7 +233,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_32x8_5 = 176, ME_TIER_ZERO_PU_32x8_6 = 177, ME_TIER_ZERO_PU_32x8_7 = 178, - // 2NxnD [10 partitions] + // 2NxnD [10 partitions] ME_TIER_ZERO_PU_64x48_0 = 179, ME_TIER_ZERO_PU_64x48_1 = 180, ME_TIER_ZERO_PU_32x24_0 = 181, @@ -244,7 +244,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_32x24_5 = 186, ME_TIER_ZERO_PU_32x24_6 = 187, ME_TIER_ZERO_PU_32x24_7 = 188, - // nLx2N [10 partitions] + // nLx2N [10 partitions] ME_TIER_ZERO_PU_16x64_0 = 189, ME_TIER_ZERO_PU_16x64_1 = 190, ME_TIER_ZERO_PU_8x32_0 = 191, @@ -255,7 +255,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_8x32_5 = 196, ME_TIER_ZERO_PU_8x32_6 = 197, ME_TIER_ZERO_PU_8x32_7 = 198, - // nRx2N [10 partitions] + // nRx2N [10 partitions] ME_TIER_ZERO_PU_48x64_0 = 199, ME_TIER_ZERO_PU_48x64_1 = 200, ME_TIER_ZERO_PU_24x32_0 = 201, @@ -269,7 +269,7 @@ typedef enum EB_ME_TIER_ZERO_PU { } EB_ME_TIER_ZERO_PU; typedef struct MeTierZero_s { - + MePredictionUnit_t pu[MAX_ME_PU_COUNT]; } MeTierZero_t; @@ -288,36 +288,36 @@ typedef struct IntraReferenceSamplesOpenLoop_s { } IntraReferenceSamplesOpenLoop_t; typedef EB_U64 (*EB_ME_DISTORTION_FUNC)( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 width, + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 width, EB_U32 height); typedef struct MePredUnit_s { EB_U32 distortion; - EB_PREDDIRECTION predictionDirection; + EB_PREDDIRECTION predictionDirection; EB_U32 Mv[MAX_NUM_OF_REF_PIC_LIST]; } MePredUnit_t; typedef struct MotionEstimationTierZero_s { - + MePredUnit_t pu[MAX_ME_PU_COUNT]; } MotionEstimationTierZero_t; typedef struct MeContext_s { - + // MV offset (search center) EB_BOOL updateHmeSearchCenter; EB_S16 xMvOffset; EB_S16 yMvOffset; // Search region stride - EB_U32 interpolatedStride; - EB_U32 interpolatedFullStride[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; + EB_U32 interpolatedStride; + EB_U32 interpolatedFullStride[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; MotionEstimationTierZero_t meCandidate[MAX_ME_CANDIDATE_PER_PU]; @@ -328,18 +328,18 @@ typedef struct MeContext_s { EB_U8 *lcuBuffer; EB_U8 *lcuBufferPtr; EB_U32 lcuBufferStride; - EB_U8 *hmeLcuBuffer; + EB_U8 *hmeLcuBuffer; EB_U32 hmeLcuBufferStride; - EB_U8 *lcuSrcPtr; - EB_U32 lcuSrcStride; + EB_U8 *lcuSrcPtr; + EB_U32 lcuSrcStride; EB_U8 *quarterLcuBuffer; EB_U32 quarterLcuBufferStride; EB_U8 *sixteenthLcuBuffer; EB_U32 sixteenthLcuBufferStride; EB_U8 *integerBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; - EB_U8 *integerBufferPtr[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; - EB_U8 *posbBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; + EB_U8 *integerBufferPtr[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; + EB_U8 *posbBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; EB_U8 *poshBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; EB_U8 *posjBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; @@ -405,12 +405,12 @@ typedef struct MeContext_s { EB_U8 psubPelDirection32x16[8]; EB_U8 psubPelDirection16x8[32]; - EB_U8 psubPelDirection32x64[2]; - EB_U8 psubPelDirection16x32[8]; + EB_U8 psubPelDirection32x64[2]; + EB_U8 psubPelDirection16x32[8]; EB_U8 psubPelDirection8x16[32]; - EB_U8 psubPelDirection64x16[2]; - EB_U8 psubPelDirection32x8[8]; + EB_U8 psubPelDirection64x16[2]; + EB_U8 psubPelDirection32x8[8]; EB_U8 psubPelDirection64x48[2]; EB_U8 psubPelDirection32x24[8]; @@ -426,7 +426,7 @@ typedef struct MeContext_s { EB_U32 pLcuBipredSad[MAX_ME_PU_COUNT];//needs to be upgraded to 209 pus EB_U32 pBestSadMap[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX][MAX_ME_PU_COUNT]; EB_U32 pBestMvMap[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX][MAX_ME_PU_COUNT]; - + EB_U32 pLcuBestSsd[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX][MAX_ME_PU_COUNT]; EB_U32 *pBestSsd8x8; @@ -436,19 +436,19 @@ typedef struct MeContext_s { EB_U16 *pEightPosSad16x16; - EB_U64 lambda; + EB_U64 lambda; EB_U8 hmeSearchType; // Multi-Mode signal(s) - EB_U8 fractionalSearchMethod; + EB_U8 fractionalSearchMethod; EB_U8 fractionalSearchModel; EB_BOOL fractionalSearch64x64; EB_BOOL oneQuadrantHME; - - // ME + + // ME EB_U8 searchAreaWidth; EB_U8 searchAreaHeight; - // HME + // HME EB_U16 numberHmeSearchRegionInWidth; EB_U16 numberHmeSearchRegionInHeight; EB_U16 hmeLevel0TotalSearchAreaWidth; @@ -461,14 +461,14 @@ typedef struct MeContext_s { EB_U16 hmeLevel2SearchAreaInHeightArray[EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_BitFraction *mvdBitsArray; + EB_BitFraction *mvdBitsArray; } MeContext_t; extern EB_ERRORTYPE MeContextCtor( MeContext_t **objectDblPtr); - + #ifdef __cplusplus } #endif -#endif // EbMotionEstimationContext_h \ No newline at end of file +#endif // EbMotionEstimationContext_h diff --git a/Source/Lib/Codec/EbMotionEstimationLcuResults.h b/Source/Lib/Codec/EbMotionEstimationLcuResults.h index e36a7ff7a..ca34ff49f 100644 --- a/Source/Lib/Codec/EbMotionEstimationLcuResults.h +++ b/Source/Lib/Codec/EbMotionEstimationLcuResults.h @@ -11,25 +11,25 @@ extern "C" { #endif #define MAX_ME_PU_COUNT 85 // Sum of all the possible partitions which have both deminsions greater than 4. - // i.e. no 4x4, 8x4, or 4x8 partitions + // i.e. no 4x4, 8x4, or 4x8 partitions #define SQUARE_PU_COUNT 85 #define MAX_ME_CANDIDATE_PER_PU 3 typedef struct MeCandidate_s { - - union { - struct { - signed short xMvL0 ; //Note: Do not change the order of these fields - signed short yMvL0 ; - signed short xMvL1 ; - signed short yMvL1 ; + + union { + struct { + signed short xMvL0 ; //Note: Do not change the order of these fields + signed short yMvL0 ; + signed short xMvL1 ; + signed short yMvL1 ; }mv; - EB_U64 MVs; - }; + EB_U64 MVs; + }; - unsigned distortion : 32; // 20-bits holds maximum SAD of 64x64 PU + unsigned distortion : 32; // 20-bits holds maximum SAD of 64x64 PU - unsigned direction : 8; // 0: uni-pred L0, 1: uni-pred L1, 2: bi-pred + unsigned direction : 8; // 0: uni-pred L0, 1: uni-pred L1, 2: bi-pred } MeCandidate_t; @@ -49,25 +49,25 @@ typedef struct MeLcuResults_s { typedef struct DistDir_s{ - unsigned distortion : 32; //20bits are enough - unsigned direction : 2; + unsigned distortion : 32; //20bits are enough + unsigned direction : 2; } DistDir_t; typedef struct MeCuResults_s { - union { - struct { - signed short xMvL0; - signed short yMvL0; - signed short xMvL1; - signed short yMvL1; - }; - EB_U64 MVs; - }; - - DistDir_t distortionDirection[3]; - - EB_U8 totalMeCandidateIndex; + union { + struct { + signed short xMvL0; + signed short yMvL0; + signed short xMvL1; + signed short yMvL1; + }; + EB_U64 MVs; + }; + + DistDir_t distortionDirection[3]; + + EB_U8 totalMeCandidateIndex; } MeCuResults_t; diff --git a/Source/Lib/Codec/EbMotionEstimationProcess.c b/Source/Lib/Codec/EbMotionEstimationProcess.c index dfd8d0bb8..409f3e801 100644 --- a/Source/Lib/Codec/EbMotionEstimationProcess.c +++ b/Source/Lib/Codec/EbMotionEstimationProcess.c @@ -20,7 +20,7 @@ #include "emmintrin.h" #define SQUARE_PU_NUM 85 -#define BUFF_CHECK_SIZE 128 +#define BUFF_CHECK_SIZE 128 #define DERIVE_INTRA_32_FROM_16 0 //CHKN 1 @@ -46,62 +46,62 @@ |42||43||46||47| |58||59||62||63| -------------------------------------*/ - + /************************************************ * Set ME/HME Params ************************************************/ static void* SetMeHmeParamsOq( MeContext_t *meContextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr, - EB_INPUT_RESOLUTION inputResolution) + PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + EB_INPUT_RESOLUTION inputResolution) { - EB_U8 hmeMeLevel = pictureControlSetPtr->encMode; + EB_U8 hmeMeLevel = pictureControlSetPtr->encMode; + + EB_U32 inputRatio = sequenceControlSetPtr->lumaWidth / sequenceControlSetPtr->lumaHeight; - EB_U32 inputRatio = sequenceControlSetPtr->lumaWidth / sequenceControlSetPtr->lumaHeight; + EB_U8 resolutionIndex = inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER ? 0 : // 480P + (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio < 2) ? 1 : // 720P + (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio > 3) ? 2 : // 1080I + (inputResolution <= INPUT_SIZE_1080p_RANGE) ? 3 : // 1080I + 4; // 4K - EB_U8 resolutionIndex = inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER ? 0 : // 480P - (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio < 2) ? 1 : // 720P - (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio > 3) ? 2 : // 1080I - (inputResolution <= INPUT_SIZE_1080p_RANGE) ? 3 : // 1080I - 4; // 4K - // HME/ME default settings - meContextPtr->numberHmeSearchRegionInWidth = EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT; - meContextPtr->numberHmeSearchRegionInHeight = EB_HME_SEARCH_AREA_ROW_MAX_COUNT; - + meContextPtr->numberHmeSearchRegionInWidth = EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT; + meContextPtr->numberHmeSearchRegionInHeight = EB_HME_SEARCH_AREA_ROW_MAX_COUNT; + // HME Level0 - meContextPtr->hmeLevel0TotalSearchAreaWidth = HmeLevel0TotalSearchAreaWidthOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0TotalSearchAreaHeight = HmeLevel0TotalSearchAreaHeightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = HmeLevel0SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInWidthArray[1] = HmeLevel0SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInHeightArray[0] = HmeLevel0SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInHeightArray[1] = HmeLevel0SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0TotalSearchAreaWidth = HmeLevel0TotalSearchAreaWidthOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0TotalSearchAreaHeight = HmeLevel0TotalSearchAreaHeightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = HmeLevel0SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInWidthArray[1] = HmeLevel0SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInHeightArray[0] = HmeLevel0SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInHeightArray[1] = HmeLevel0SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; // HME Level1 - meContextPtr->hmeLevel1SearchAreaInWidthArray[0] = HmeLevel1SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel1SearchAreaInWidthArray[1] = HmeLevel1SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel1SearchAreaInHeightArray[0] = HmeLevel1SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel1SearchAreaInHeightArray[1] = HmeLevel1SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInWidthArray[0] = HmeLevel1SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInWidthArray[1] = HmeLevel1SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInHeightArray[0] = HmeLevel1SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInHeightArray[1] = HmeLevel1SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; // HME Level2 - meContextPtr->hmeLevel2SearchAreaInWidthArray[0] = HmeLevel2SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel2SearchAreaInWidthArray[1] = HmeLevel2SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel2SearchAreaInHeightArray[0] = HmeLevel2SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel2SearchAreaInHeightArray[1] = HmeLevel2SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInWidthArray[0] = HmeLevel2SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInWidthArray[1] = HmeLevel2SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInHeightArray[0] = HmeLevel2SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInHeightArray[1] = HmeLevel2SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; // ME - meContextPtr->searchAreaWidth = SearchAreaWidthOq[resolutionIndex][hmeMeLevel]; - meContextPtr->searchAreaHeight = SearchAreaHeightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->searchAreaWidth = SearchAreaWidthOq[resolutionIndex][hmeMeLevel]; + meContextPtr->searchAreaHeight = SearchAreaHeightOq[resolutionIndex][hmeMeLevel]; - // HME Level0 adjustment for low frame rate contents (frame rate <= 30) + // HME Level0 adjustment for low frame rate contents (frame rate <= 30) if (inputResolution == INPUT_SIZE_4K_RANGE) { if ((sequenceControlSetPtr->staticConfig.frameRate >> 16) <= 30) { if (hmeMeLevel == ENC_MODE_6 || hmeMeLevel == ENC_MODE_7) { meContextPtr->hmeLevel0TotalSearchAreaWidth = MAX(96 , meContextPtr->hmeLevel0TotalSearchAreaWidth ); meContextPtr->hmeLevel0TotalSearchAreaHeight = MAX(64 , meContextPtr->hmeLevel0TotalSearchAreaHeight ); - meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = MAX(48 , meContextPtr->hmeLevel0SearchAreaInWidthArray[0] ); + meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = MAX(48 , meContextPtr->hmeLevel0SearchAreaInWidthArray[0] ); meContextPtr->hmeLevel0SearchAreaInWidthArray[1] = MAX(48 , meContextPtr->hmeLevel0SearchAreaInWidthArray[1] ); meContextPtr->hmeLevel0SearchAreaInHeightArray[0] = MAX(32 , meContextPtr->hmeLevel0SearchAreaInHeightArray[0] ); meContextPtr->hmeLevel0SearchAreaInHeightArray[1] = MAX(32 , meContextPtr->hmeLevel0SearchAreaInHeightArray[1] ); @@ -109,7 +109,7 @@ static void* SetMeHmeParamsOq( else if (hmeMeLevel >= ENC_MODE_8) { meContextPtr->hmeLevel0TotalSearchAreaWidth = MAX(64 , meContextPtr->hmeLevel0TotalSearchAreaWidth ); meContextPtr->hmeLevel0TotalSearchAreaHeight = MAX(48 , meContextPtr->hmeLevel0TotalSearchAreaHeight ); - meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = MAX(32 , meContextPtr->hmeLevel0SearchAreaInWidthArray[0] ); + meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = MAX(32 , meContextPtr->hmeLevel0SearchAreaInWidthArray[0] ); meContextPtr->hmeLevel0SearchAreaInWidthArray[1] = MAX(32 , meContextPtr->hmeLevel0SearchAreaInWidthArray[1] ); meContextPtr->hmeLevel0SearchAreaInHeightArray[0] = MAX(24 , meContextPtr->hmeLevel0SearchAreaInHeightArray[0] ); meContextPtr->hmeLevel0SearchAreaInHeightArray[1] = MAX(24 , meContextPtr->hmeLevel0SearchAreaInHeightArray[1] ); @@ -120,7 +120,7 @@ static void* SetMeHmeParamsOq( if ((inputResolution > INPUT_SIZE_576p_RANGE_OR_LOWER) && (sequenceControlSetPtr->staticConfig.tune > 0)) { meContextPtr->updateHmeSearchCenter = EB_TRUE; } - return EB_NULL; + return EB_NULL; }; @@ -130,7 +130,7 @@ static void* SetMeHmeParamsOq( * Set ME/HME Params from Config ************************************************/ static void SetMeHmeParamsFromConfig( - SequenceControlSet_t *sequenceControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, MeContext_t *meContextPtr) { @@ -143,28 +143,28 @@ static void SetMeHmeParamsFromConfig( ************************************************/ EB_ERRORTYPE MotionEstimationContextCtor( - MotionEstimationContext_t **contextDblPtr, - EbFifo_t *pictureDecisionResultsInputFifoPtr, - EbFifo_t *motionEstimationResultsOutputFifoPtr) { + MotionEstimationContext_t **contextDblPtr, + EbFifo_t *pictureDecisionResultsInputFifoPtr, + EbFifo_t *motionEstimationResultsOutputFifoPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - MotionEstimationContext_t *contextPtr; - EB_MALLOC(MotionEstimationContext_t*, contextPtr, sizeof(MotionEstimationContext_t), EB_N_PTR); + EB_ERRORTYPE return_error = EB_ErrorNone; + MotionEstimationContext_t *contextPtr; + EB_MALLOC(MotionEstimationContext_t*, contextPtr, sizeof(MotionEstimationContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; + *contextDblPtr = contextPtr; - contextPtr->pictureDecisionResultsInputFifoPtr = pictureDecisionResultsInputFifoPtr; - contextPtr->motionEstimationResultsOutputFifoPtr = motionEstimationResultsOutputFifoPtr; - return_error = IntraOpenLoopReferenceSamplesCtor(&contextPtr->intraRefPtr); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - return_error = MeContextCtor(&(contextPtr->meContextPtr)); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } + contextPtr->pictureDecisionResultsInputFifoPtr = pictureDecisionResultsInputFifoPtr; + contextPtr->motionEstimationResultsOutputFifoPtr = motionEstimationResultsOutputFifoPtr; + return_error = IntraOpenLoopReferenceSamplesCtor(&contextPtr->intraRefPtr); + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + return_error = MeContextCtor(&(contextPtr->meContextPtr)); + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } - return EB_ErrorNone; + return EB_ErrorNone; } @@ -172,130 +172,130 @@ EB_ERRORTYPE MotionEstimationContextCtor( * ZZ Decimated SAD Computation ***************************************************************************************************/ static EB_ERRORTYPE ComputeDecimatedZzSad( - MotionEstimationContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 xLcuStartIndex, - EB_U32 xLcuEndIndex, - EB_U32 yLcuStartIndex, - EB_U32 yLcuEndIndex) { + MotionEstimationContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 xLcuStartIndex, + EB_U32 xLcuEndIndex, + EB_U32 yLcuStartIndex, + EB_U32 yLcuEndIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - PictureParentControlSet_t *previousPictureControlSetWrapperPtr = ((PictureParentControlSet_t*)pictureControlSetPtr->previousPictureControlSetWrapperPtr->objectPtr); - EbPictureBufferDesc_t *previousInputPictureFull = previousPictureControlSetWrapperPtr->enhancedPicturePtr; + PictureParentControlSet_t *previousPictureControlSetWrapperPtr = ((PictureParentControlSet_t*)pictureControlSetPtr->previousPictureControlSetWrapperPtr->objectPtr); + EbPictureBufferDesc_t *previousInputPictureFull = previousPictureControlSetWrapperPtr->enhancedPicturePtr; - EB_U32 lcuIndex; + EB_U32 lcuIndex; - EB_U32 lcuWidth; - EB_U32 lcuHeight; + EB_U32 lcuWidth; + EB_U32 lcuHeight; - EB_U32 decimatedLcuWidth; - EB_U32 decimatedLcuHeight; + EB_U32 decimatedLcuWidth; + EB_U32 decimatedLcuHeight; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; - EB_U32 blkDisplacementDecimated; - EB_U32 blkDisplacementFull; + EB_U32 blkDisplacementDecimated; + EB_U32 blkDisplacementFull; - EB_U32 decimatedLcuCollocatedSad; + EB_U32 decimatedLcuCollocatedSad; - EB_U32 xLcuIndex; - EB_U32 yLcuIndex; + EB_U32 xLcuIndex; + EB_U32 yLcuIndex; - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuIndex = xLcuIndex + yLcuIndex * sequenceControlSetPtr->pictureWidthInLcu; + lcuIndex = xLcuIndex + yLcuIndex * sequenceControlSetPtr->pictureWidthInLcu; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - lcuWidth = lcuParams->width; - lcuHeight = lcuParams->height; + lcuWidth = lcuParams->width; + lcuHeight = lcuParams->height; - lcuOriginX = lcuParams->originX; - lcuOriginY = lcuParams->originY; + lcuOriginX = lcuParams->originX; + lcuOriginY = lcuParams->originY; - lcuWidth = lcuParams->width; - lcuHeight = lcuParams->height; + lcuWidth = lcuParams->width; + lcuHeight = lcuParams->height; - decimatedLcuWidth = lcuWidth >> 2; - decimatedLcuHeight = lcuHeight >> 2; + decimatedLcuWidth = lcuWidth >> 2; + decimatedLcuHeight = lcuHeight >> 2; - decimatedLcuCollocatedSad = 0; + decimatedLcuCollocatedSad = 0; if (lcuParams->isCompleteLcu) - { + { - blkDisplacementDecimated = (sixteenthDecimatedPicturePtr->originY + (lcuOriginY >> 2)) * sixteenthDecimatedPicturePtr->strideY + sixteenthDecimatedPicturePtr->originX + (lcuOriginX >> 2); + blkDisplacementDecimated = (sixteenthDecimatedPicturePtr->originY + (lcuOriginY >> 2)) * sixteenthDecimatedPicturePtr->strideY + sixteenthDecimatedPicturePtr->originX + (lcuOriginX >> 2); blkDisplacementFull = (previousInputPictureFull->originY + lcuOriginY)* previousInputPictureFull->strideY + (previousInputPictureFull->originX + lcuOriginX); - // 1/16 collocated LCU decimation - Decimation2D( - &previousInputPictureFull->bufferY[blkDisplacementFull], - previousInputPictureFull->strideY, - MAX_LCU_SIZE, - MAX_LCU_SIZE, - contextPtr->meContextPtr->sixteenthLcuBuffer, - contextPtr->meContextPtr->sixteenthLcuBufferStride, - 4); - - // ZZ SAD between 1/16 current & 1/16 collocated - decimatedLcuCollocatedSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][2]( - &(sixteenthDecimatedPicturePtr->bufferY[blkDisplacementDecimated]), - sixteenthDecimatedPicturePtr->strideY, - contextPtr->meContextPtr->sixteenthLcuBuffer, - contextPtr->meContextPtr->sixteenthLcuBufferStride, - 16, 16); - - // Background Enhancement Algorithm - // Classification is important to: - // 1. Avoid improving moving objects. - // 2. Do not modulate when all the picture is background - // 3. Do give different importance to different regions - if (decimatedLcuCollocatedSad < BEA_CLASS_0_0_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < BEA_CLASS_0_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_1_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < BEA_CLASS_1_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < BEA_CLASS_2_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; - } - else { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; - } - - - } - else { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = INVALID_ZZ_COST; - decimatedLcuCollocatedSad = (EB_U32)~0; - } - - - // Keep track of non moving LCUs for QP modulation - if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 2)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 8)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; - } - else { //if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; - } - } - } - - return return_error; + // 1/16 collocated LCU decimation + Decimation2D( + &previousInputPictureFull->bufferY[blkDisplacementFull], + previousInputPictureFull->strideY, + MAX_LCU_SIZE, + MAX_LCU_SIZE, + contextPtr->meContextPtr->sixteenthLcuBuffer, + contextPtr->meContextPtr->sixteenthLcuBufferStride, + 4); + + // ZZ SAD between 1/16 current & 1/16 collocated + decimatedLcuCollocatedSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][2]( + &(sixteenthDecimatedPicturePtr->bufferY[blkDisplacementDecimated]), + sixteenthDecimatedPicturePtr->strideY, + contextPtr->meContextPtr->sixteenthLcuBuffer, + contextPtr->meContextPtr->sixteenthLcuBufferStride, + 16, 16); + + // Background Enhancement Algorithm + // Classification is important to: + // 1. Avoid improving moving objects. + // 2. Do not modulate when all the picture is background + // 3. Do give different importance to different regions + if (decimatedLcuCollocatedSad < BEA_CLASS_0_0_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < BEA_CLASS_0_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_1_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < BEA_CLASS_1_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < BEA_CLASS_2_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; + } + else { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; + } + + + } + else { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = INVALID_ZZ_COST; + decimatedLcuCollocatedSad = (EB_U32)~0; + } + + + // Keep track of non moving LCUs for QP modulation + if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 2)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 8)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; + } + else { //if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; + } + } + } + + return return_error; } /****************************************************** @@ -344,78 +344,78 @@ EB_ERRORTYPE SignalDerivationMeKernelOq( } // Set 64x64 Fractional Search Flag - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->meContextPtr->fractionalSearch64x64 = EB_TRUE; - } - else { - contextPtr->meContextPtr->fractionalSearch64x64 = EB_FALSE; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->meContextPtr->fractionalSearch64x64 = EB_TRUE; + } + else { + contextPtr->meContextPtr->fractionalSearch64x64 = EB_FALSE; + } // Set OIS Kernel - if (pictureControlSetPtr->encMode <= ENC_MODE_4) { - if (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE) { - contextPtr->oisKernelLevel = (pictureControlSetPtr->temporalLayerIndex == 0) ? EB_TRUE : EB_FALSE; - } - else { - contextPtr->oisKernelLevel = EB_FALSE; - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_4) { + if (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE) { + contextPtr->oisKernelLevel = (pictureControlSetPtr->temporalLayerIndex == 0) ? EB_TRUE : EB_FALSE; + } + else { + contextPtr->oisKernelLevel = EB_FALSE; + } + } else { contextPtr->oisKernelLevel = EB_FALSE; } - + // Set OIS TH - // 0: Agressive + // 0: Agressive // 1: Default // 2: Conservative if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { if (pictureControlSetPtr->encMode <= ENC_MODE_5) { if (pictureControlSetPtr->isUsedAsReferenceFlag == EB_TRUE) { - contextPtr->oisThSet = 2; + contextPtr->oisThSet = 2; } else { - contextPtr->oisThSet = 1; + contextPtr->oisThSet = 1; } } else { - contextPtr->oisThSet = 1; + contextPtr->oisThSet = 1; } } else { - if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->oisThSet = 2; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + contextPtr->oisThSet = 2; + } else { - contextPtr->oisThSet = 1; + contextPtr->oisThSet = 1; } } - + // Set valid flag for the best OIS - contextPtr->setBestOisDistortionToValid = EB_FALSE; + contextPtr->setBestOisDistortionToValid = EB_FALSE; // Set fractional search model - // 0: search all blocks + // 0: search all blocks // 1: selective based on Full-Search SAD & MV. // 2: off if (pictureControlSetPtr->useSubpelFlag == 1) { if (pictureControlSetPtr->encMode <= ENC_MODE_5) { contextPtr->meContextPtr->fractionalSearchModel = 0; } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - contextPtr->meContextPtr->fractionalSearchModel = 1; - } - else { - contextPtr->meContextPtr->fractionalSearchModel = 0; - } - } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + contextPtr->meContextPtr->fractionalSearchModel = 1; + } + else { + contextPtr->meContextPtr->fractionalSearchModel = 0; + } + } else { contextPtr->meContextPtr->fractionalSearchModel = 1; } } else { contextPtr->meContextPtr->fractionalSearchModel = 2; - } + } return return_error; } @@ -427,10 +427,10 @@ EB_ERRORTYPE SignalDerivationMeKernelOq( Output : List0 MV ******************************************************/ void GetMv( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv) + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv) { MeCuResults_t * cuResults = &pictureControlSetPtr->meResults[lcuIndex][0]; @@ -445,8 +445,8 @@ void GetMv( Output : Best ME Distortion ******************************************************/ void GetMeDist( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, EB_U32 *distortion) { @@ -459,7 +459,7 @@ void GetMeDist( ******************************************************/ static void DeriveSimilarCollocatedFlag( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + EB_U32 lcuIndex) { // Similairty detector for collocated LCU pictureControlSetPtr->similarColocatedLcuArray[lcuIndex] = EB_FALSE; @@ -502,15 +502,15 @@ static void StationaryEdgeOverUpdateOverTimeLcuPart1( PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuIndex) { - EB_S32 xCurrentMv = 0; - EB_S32 yCurrentMv = 0; + EB_S32 xCurrentMv = 0; + EB_S32 yCurrentMv = 0; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; if (lcuParams->potentialLogoLcu && lcuParams->isCompleteLcu) { - // Current MV + // Current MV if (pictureControlSetPtr->temporalLayerIndex > 0) GetMv(pictureControlSetPtr, lcuIndex, &xCurrentMv, &yCurrentMv); @@ -558,36 +558,36 @@ static void StationaryEdgeOverUpdateOverTimeLcuPart2( LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - + if (lcuParams->potentialLogoLcu && lcuParams->isCompleteLcu) { EB_U32 meDist = 0; - + EB_BOOL lowSad = EB_FALSE; - + if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { GetMeDist(pictureControlSetPtr, lcuIndex, &meDist); } lowSad = (pictureControlSetPtr->sliceType != EB_B_PICTURE) ? - + EB_FALSE : (meDist < 64 * 64 * lowSadTh) ? EB_TRUE : EB_FALSE; - + if (lowSad) { lcuStatPtr->check2ForLogoStationaryEdgeOverTimeFlag = 0; lcuStatPtr->lowDistLogo = 1; } else { lcuStatPtr->check2ForLogoStationaryEdgeOverTimeFlag = 1; - + lcuStatPtr->lowDistLogo = 0; } } else { lcuStatPtr->check2ForLogoStationaryEdgeOverTimeFlag = 0; - + lcuStatPtr->lowDistLogo = 0; } lcuStatPtr->check2ForLogoStationaryEdgeOverTimeFlag = 1; - + } /************************************************ @@ -600,95 +600,95 @@ static void StationaryEdgeOverUpdateOverTimeLcuPart2( ************************************************/ void* MotionEstimationKernel(void *inputPtr) { - MotionEstimationContext_t *contextPtr = (MotionEstimationContext_t*)inputPtr; + MotionEstimationContext_t *contextPtr = (MotionEstimationContext_t*)inputPtr; - PictureParentControlSet_t *pictureControlSetPtr; - SequenceControlSet_t *sequenceControlSetPtr; + PictureParentControlSet_t *pictureControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; - EbObjectWrapper_t *inputResultsWrapperPtr; - PictureDecisionResults_t *inputResultsPtr; + EbObjectWrapper_t *inputResultsWrapperPtr; + PictureDecisionResults_t *inputResultsPtr; - EbObjectWrapper_t *outputResultsWrapperPtr; - MotionEstimationResults_t *outputResultsPtr; + EbObjectWrapper_t *outputResultsWrapperPtr; + MotionEstimationResults_t *outputResultsPtr; - EbPictureBufferDesc_t *inputPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr; EbPictureBufferDesc_t *inputPaddedPicturePtr; - EB_U32 bufferIndex; + EB_U32 bufferIndex; - EB_U32 lcuIndex; - EB_U32 xLcuIndex; - EB_U32 yLcuIndex; - EB_U32 pictureWidthInLcu; - EB_U32 pictureHeightInLcu; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U32 lcuWidth; - EB_U32 lcuHeight; - EB_U32 lcuRow; + EB_U32 lcuIndex; + EB_U32 xLcuIndex; + EB_U32 yLcuIndex; + EB_U32 pictureWidthInLcu; + EB_U32 pictureHeightInLcu; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U32 lcuWidth; + EB_U32 lcuHeight; + EB_U32 lcuRow; - EbPaReferenceObject_t *paReferenceObject; - EbPictureBufferDesc_t *quarterDecimatedPicturePtr; - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; + EbPaReferenceObject_t *paReferenceObject; + EbPictureBufferDesc_t *quarterDecimatedPicturePtr; + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; - // Segments - EB_U32 segmentIndex; - EB_U32 xSegmentIndex; - EB_U32 ySegmentIndex; - EB_U32 xLcuStartIndex; - EB_U32 xLcuEndIndex; - EB_U32 yLcuStartIndex; - EB_U32 yLcuEndIndex; + // Segments + EB_U32 segmentIndex; + EB_U32 xSegmentIndex; + EB_U32 ySegmentIndex; + EB_U32 xLcuStartIndex; + EB_U32 xLcuEndIndex; + EB_U32 yLcuStartIndex; + EB_U32 yLcuEndIndex; - EB_U32 intraSadIntervalIndex; + EB_U32 intraSadIntervalIndex; - MdRateEstimationContext_t *mdRateEstimationArray; + MdRateEstimationContext_t *mdRateEstimationArray; - for (;;) { + for (;;) { - // Get Input Full Object - EbGetFullObject( - contextPtr->pictureDecisionResultsInputFifoPtr, - &inputResultsWrapperPtr); + // Get Input Full Object + EbGetFullObject( + contextPtr->pictureDecisionResultsInputFifoPtr, + &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (PictureDecisionResults_t*)inputResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; - quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; - sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; + inputResultsPtr = (PictureDecisionResults_t*)inputResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; + quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; + sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; inputPaddedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->inputPaddedPicturePtr; - inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld ME IN \n", pictureControlSetPtr->pictureNumber); #endif - // Segments - segmentIndex = inputResultsPtr->segmentIndex; - pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - SEGMENT_CONVERT_IDX_TO_XY(segmentIndex, xSegmentIndex, ySegmentIndex, pictureControlSetPtr->meSegmentsColumnCount); - xLcuStartIndex = SEGMENT_START_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); - xLcuEndIndex = SEGMENT_END_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); - yLcuStartIndex = SEGMENT_START_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); - yLcuEndIndex = SEGMENT_END_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); - // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type - mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; - mdRateEstimationArray += pictureControlSetPtr->sliceType * TOTAL_NUMBER_OF_QP_VALUES + pictureControlSetPtr->pictureQp; - // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray - EB_MEMCPY(&(contextPtr->meContextPtr->mvdBitsArray[0]), &(mdRateEstimationArray->mvdBits[0]), sizeof(EB_BitFraction)*NUMBER_OF_MVD_CASES); + // Segments + segmentIndex = inputResultsPtr->segmentIndex; + pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + SEGMENT_CONVERT_IDX_TO_XY(segmentIndex, xSegmentIndex, ySegmentIndex, pictureControlSetPtr->meSegmentsColumnCount); + xLcuStartIndex = SEGMENT_START_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); + xLcuEndIndex = SEGMENT_END_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); + yLcuStartIndex = SEGMENT_START_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); + yLcuEndIndex = SEGMENT_END_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); + // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type + mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; + mdRateEstimationArray += pictureControlSetPtr->sliceType * TOTAL_NUMBER_OF_QP_VALUES + pictureControlSetPtr->pictureQp; + // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray + EB_MEMCPY(&(contextPtr->meContextPtr->mvdBitsArray[0]), &(mdRateEstimationArray->mvdBits[0]), sizeof(EB_BitFraction)*NUMBER_OF_MVD_CASES); SignalDerivationMeKernelOq( sequenceControlSetPtr, pictureControlSetPtr, - contextPtr); + contextPtr); - // Lambda Assignement + // Lambda Assignement if (pictureControlSetPtr->temporalLayerIndex == 0) { contextPtr->meContextPtr->lambda = lambdaModeDecisionRaSadBase[pictureControlSetPtr->pictureQp]; } @@ -725,7 +725,7 @@ void* MotionEstimationKernel(void *inputPtr) EB_U8 * srcPtr = &inputPaddedPicturePtr->bufferY[bufferIndex]; - //_MM_HINT_T0 //_MM_HINT_T1 //_MM_HINT_T2//_MM_HINT_NTA + //_MM_HINT_T0 //_MM_HINT_T1 //_MM_HINT_T2//_MM_HINT_NTA EB_U32 i; for (i = 0; i < lcuHeight; i++) { @@ -777,20 +777,20 @@ void* MotionEstimationKernel(void *inputPtr) } } - // OIS + Similar Collocated Checks + Stationary Edge Over Time Check + // OIS + Similar Collocated Checks + Stationary Edge Over Time Check // LCU Loop - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; - lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); - OpenLoopIntraSearchLcu( - pictureControlSetPtr, - lcuIndex, - contextPtr, - inputPicturePtr); + OpenLoopIntraSearchLcu( + pictureControlSetPtr, + lcuIndex, + contextPtr, + inputPicturePtr); // Derive Similar Collocated Flag DeriveSimilarCollocatedFlag( @@ -810,16 +810,16 @@ void* MotionEstimationKernel(void *inputPtr) pictureControlSetPtr, lcuIndex); } - } - } + } + } - // ZZ SADs Computation - // 1 lookahead frame is needed to get valid (0,0) SAD - if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { - // when DG is ON, the ZZ SADs are computed @ the PD process - { - // ZZ SADs Computation using decimated picture - if (pictureControlSetPtr->pictureNumber > 0) { + // ZZ SADs Computation + // 1 lookahead frame is needed to get valid (0,0) SAD + if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { + // when DG is ON, the ZZ SADs are computed @ the PD process + { + // ZZ SADs Computation using decimated picture + if (pictureControlSetPtr->pictureNumber > 0) { ComputeDecimatedZzSad( contextPtr, @@ -830,33 +830,33 @@ void* MotionEstimationKernel(void *inputPtr) xLcuEndIndex, yLcuStartIndex, yLcuEndIndex); - - } - } - } + } + } + } - // Calculate the ME Distortion and OIS Historgrams + + // Calculate the ME Distortion and OIS Historgrams EbBlockOnMutex(pictureControlSetPtr->rcDistortionHistogramMutex); - if (sequenceControlSetPtr->staticConfig.rateControlMode){ - if (pictureControlSetPtr->sliceType != EB_I_PICTURE){ - EB_U16 sadIntervalIndex; - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - - lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; - lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; - lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; - lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; - - lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); + if (sequenceControlSetPtr->staticConfig.rateControlMode){ + if (pictureControlSetPtr->sliceType != EB_I_PICTURE){ + EB_U16 sadIntervalIndex; + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + + lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; + lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; + lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; + + lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); pictureControlSetPtr->interSadIntervalIndex[lcuIndex] = 0; pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = 0; - if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { + if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { - sadIntervalIndex = (EB_U16)(pictureControlSetPtr->rcMEdistortion[lcuIndex] >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) + sadIntervalIndex = (EB_U16)(pictureControlSetPtr->rcMEdistortion[lcuIndex] >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) sadIntervalIndex = (EB_U16)(sadIntervalIndex >> 2); if (sadIntervalIndex > (NUMBER_OF_SAD_INTERVALS>>1) -1){ @@ -867,20 +867,20 @@ void* MotionEstimationKernel(void *inputPtr) } if (sadIntervalIndex >= NUMBER_OF_SAD_INTERVALS - 1) sadIntervalIndex = NUMBER_OF_SAD_INTERVALS - 1; - - - pictureControlSetPtr->interSadIntervalIndex[lcuIndex] = sadIntervalIndex; + + + pictureControlSetPtr->interSadIntervalIndex[lcuIndex] = sadIntervalIndex; pictureControlSetPtr->meDistortionHistogram[sadIntervalIndex] ++; - + EB_U32 bestOisCuIndex = 0; - //DOUBLE CHECK THIS PIECE OF CODE + //DOUBLE CHECK THIS PIECE OF CODE intraSadIntervalIndex = (EB_U32) - (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; + (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; intraSadIntervalIndex = (EB_U16)(intraSadIntervalIndex >> 2); if (intraSadIntervalIndex > (NUMBER_OF_SAD_INTERVALS >> 1) - 1){ @@ -892,46 +892,46 @@ void* MotionEstimationKernel(void *inputPtr) if (intraSadIntervalIndex >= NUMBER_OF_SAD_INTERVALS - 1) intraSadIntervalIndex = NUMBER_OF_SAD_INTERVALS - 1; - - pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = intraSadIntervalIndex; - pictureControlSetPtr->oisDistortionHistogram[intraSadIntervalIndex] ++; + pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = intraSadIntervalIndex; + pictureControlSetPtr->oisDistortionHistogram[intraSadIntervalIndex] ++; - ++pictureControlSetPtr->fullLcuCount; - } - } - } - } - else{ - EB_U32 bestOisCuIndex = 0; + ++pictureControlSetPtr->fullLcuCount; + } + + } + } + } + else{ + EB_U32 bestOisCuIndex = 0; - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; - lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; - lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; - lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; + lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; + lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); - + pictureControlSetPtr->interSadIntervalIndex[lcuIndex] = 0; pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = 0; - if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { + if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { + + + //DOUBLE CHECK THIS PIECE OF CODE + intraSadIntervalIndex = (EB_U32) + (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; - //DOUBLE CHECK THIS PIECE OF CODE - - intraSadIntervalIndex = (EB_U32) - (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; - intraSadIntervalIndex = (EB_U16)(intraSadIntervalIndex >> 2); if (intraSadIntervalIndex > (NUMBER_OF_SAD_INTERVALS >> 1) - 1){ EB_U32 sadIntervalIndexTemp = intraSadIntervalIndex - ((NUMBER_OF_SAD_INTERVALS >> 1) - 1); @@ -943,32 +943,32 @@ void* MotionEstimationKernel(void *inputPtr) intraSadIntervalIndex = NUMBER_OF_SAD_INTERVALS - 1; pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = intraSadIntervalIndex; - pictureControlSetPtr->oisDistortionHistogram[intraSadIntervalIndex] ++; - ++pictureControlSetPtr->fullLcuCount; - } - - } - } - } - } + pictureControlSetPtr->oisDistortionHistogram[intraSadIntervalIndex] ++; + ++pictureControlSetPtr->fullLcuCount; + } + + } + } + } + } #if DEADLOCK_DEBUG SVT_LOG("POC %lld ME OUT \n", pictureControlSetPtr->pictureNumber); #endif EbReleaseMutex(pictureControlSetPtr->rcDistortionHistogramMutex); - // Get Empty Results Object - EbGetEmptyObject( - contextPtr->motionEstimationResultsOutputFifoPtr, - &outputResultsWrapperPtr); - - outputResultsPtr = (MotionEstimationResults_t*)outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; - outputResultsPtr->segmentIndex = segmentIndex; - - // Release the Input Results - EbReleaseObject(inputResultsWrapperPtr); - - // Post the Full Results Object - EbPostFullObject(outputResultsWrapperPtr); - } - return EB_NULL; + // Get Empty Results Object + EbGetEmptyObject( + contextPtr->motionEstimationResultsOutputFifoPtr, + &outputResultsWrapperPtr); + + outputResultsPtr = (MotionEstimationResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; + outputResultsPtr->segmentIndex = segmentIndex; + + // Release the Input Results + EbReleaseObject(inputResultsWrapperPtr); + + // Post the Full Results Object + EbPostFullObject(outputResultsWrapperPtr); + } + return EB_NULL; } diff --git a/Source/Lib/Codec/EbMotionEstimationProcess.h b/Source/Lib/Codec/EbMotionEstimationProcess.h index b5815f015..e509763e6 100644 --- a/Source/Lib/Codec/EbMotionEstimationProcess.h +++ b/Source/Lib/Codec/EbMotionEstimationProcess.h @@ -19,7 +19,7 @@ extern "C" { * Context **************************************/ typedef struct MotionEstimationContext_s -{ +{ EbFifo_t *pictureDecisionResultsInputFifoPtr; EbFifo_t *motionEstimationResultsOutputFifoPtr; @@ -38,14 +38,14 @@ typedef struct MotionEstimationContext_s * Extern Function Declaration ***************************************/ extern EB_ERRORTYPE MotionEstimationContextCtor( - MotionEstimationContext_t **contextDblPtr, - EbFifo_t *pictureDecisionResultsInputFifoPtr, - EbFifo_t *motionEstimationResultsOutputFifoPtr); + MotionEstimationContext_t **contextDblPtr, + EbFifo_t *pictureDecisionResultsInputFifoPtr, + EbFifo_t *motionEstimationResultsOutputFifoPtr); -extern void* MotionEstimationKernel(void *inputPtr); +extern void* MotionEstimationKernel(void *inputPtr); #ifdef __cplusplus } #endif -#endif // EbMotionEstimationProcess_h \ No newline at end of file +#endif // EbMotionEstimationProcess_h diff --git a/Source/Lib/Codec/EbMotionEstimationResults.c b/Source/Lib/Codec/EbMotionEstimationResults.c index 68ba36161..0c9f42c12 100644 --- a/Source/Lib/Codec/EbMotionEstimationResults.c +++ b/Source/Lib/Codec/EbMotionEstimationResults.c @@ -14,7 +14,7 @@ EB_ERRORTYPE MotionEstimationResultsCtor( { MotionEstimationResults_t *contextPtr; EB_MALLOC(MotionEstimationResults_t*, contextPtr, sizeof(MotionEstimationResults_t), EB_N_PTR); - + *objectDblPtr = (EB_PTR) contextPtr; objectInitDataPtr = 0; diff --git a/Source/Lib/Codec/EbMotionEstimationResults.h b/Source/Lib/Codec/EbMotionEstimationResults.h index c357e49a3..c5e1f94e5 100644 --- a/Source/Lib/Codec/EbMotionEstimationResults.h +++ b/Source/Lib/Codec/EbMotionEstimationResults.h @@ -14,7 +14,7 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct MotionEstimationResults_s +typedef struct MotionEstimationResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; EB_U32 segmentIndex; @@ -29,11 +29,11 @@ typedef struct MotionEstimationResultsInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE MotionEstimationResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus } #endif -#endif // EbMotionEstimationResults_h \ No newline at end of file +#endif // EbMotionEstimationResults_h diff --git a/Source/Lib/Codec/EbMotionVectorUnit.h b/Source/Lib/Codec/EbMotionVectorUnit.h index 912963d1d..69c70d5cc 100644 --- a/Source/Lib/Codec/EbMotionVectorUnit.h +++ b/Source/Lib/Codec/EbMotionVectorUnit.h @@ -13,18 +13,18 @@ extern "C" { #pragma pack(push, 1) typedef union { - struct - { - signed short x; - signed short y; - }; - EB_U32 mvUnion; + struct + { + signed short x; + signed short y; + }; + EB_U32 mvUnion; } Mv_t; #pragma pack(pop) #pragma pack(push, 1) -typedef struct +typedef struct { signed mvdX : 16; signed mvdY : 16; @@ -32,17 +32,17 @@ typedef struct unsigned : 7; unsigned predIdx : 1; unsigned : 7; - + } Mvd_t; #pragma pack(pop) typedef struct { - Mv_t mv[MAX_NUM_OF_REF_PIC_LIST]; - EB_U8 predDirection; + Mv_t mv[MAX_NUM_OF_REF_PIC_LIST]; + EB_U8 predDirection; } MvUnit_t; #ifdef __cplusplus } #endif -#endif // EbMotionVectorUnit_h \ No newline at end of file +#endif // EbMotionVectorUnit_h diff --git a/Source/Lib/Codec/EbNeighborArrays.c b/Source/Lib/Codec/EbNeighborArrays.c index 946223b51..5258968a5 100644 --- a/Source/Lib/Codec/EbNeighborArrays.c +++ b/Source/Lib/Codec/EbNeighborArrays.c @@ -23,7 +23,7 @@ EB_ERRORTYPE NeighborArrayUnitCtor( { NeighborArrayUnit_t *naUnitPtr; EB_MALLOC(NeighborArrayUnit_t*, naUnitPtr, sizeof(NeighborArrayUnit_t), EB_N_PTR); - + *naUnitDblPtr = naUnitPtr; naUnitPtr->unitSize = (EB_U8)(unitSize); naUnitPtr->granularityNormal = (EB_U8)(granularityNormal); @@ -248,7 +248,7 @@ void NeighborArrayUnitSampleWrite( picOriginX, picOriginY + (blockWidth - 1)) * naUnitPtr->unitSize; - EB_MEMCPY(dstPtr,readPtr,blockWidth); + EB_MEMCPY(dstPtr,readPtr,blockWidth); // Reset readPtr to the right-column readPtr = srcPtr + (blockWidth - 1); @@ -468,37 +468,37 @@ void NeighborArrayUnitModeWrite( { EB_U32 idx; EB_U8 *dstPtr; - + EB_U32 count; EB_U32 naOffset; - EB_U32 naUnitSize; + EB_U32 naUnitSize; - naUnitSize = naUnitPtr->unitSize; + naUnitSize = naUnitPtr->unitSize; if(neighborArrayTypeMask & NEIGHBOR_ARRAY_UNIT_TOP_MASK) { - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ + // | | // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX naOffset = GetNeighborArrayUnitTopIndex( naUnitPtr, originX); - dstPtr = naUnitPtr->topArray + + dstPtr = naUnitPtr->topArray + naOffset * naUnitSize; - + count = blockWidth >> naUnitPtr->granularityNormalLog2; for(idx = 0; idx < count; ++idx) { @@ -512,26 +512,26 @@ void NeighborArrayUnitModeWrite( if(neighborArrayTypeMask & NEIGHBOR_ARRAY_UNIT_LEFT_MASK) { // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY naOffset = GetNeighborArrayUnitLeftIndex( naUnitPtr, originY); - dstPtr = naUnitPtr->leftArray + + dstPtr = naUnitPtr->leftArray + naOffset * naUnitSize; count = blockHeight >> naUnitPtr->granularityNormalLog2; @@ -545,23 +545,23 @@ void NeighborArrayUnitModeWrite( } if(neighborArrayTypeMask & NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK) { - + /* // Top-left Neighbor Array - // + // // 4-5--6--7------------ - // 3 \ \ - // 2 \ \ - // 1 \ \ - // |\ xxxxxx7 - // | \ x 6 - // | \ x 5 - // | \1x2x3x4 - // | - // - // The top-left neighbor array is updated with the reversed samples - // from the right column and bottom row of the source block - // + // 3 \ \ + // 2 \ \ + // 1 \ \ + // |\ xxxxxx7 + // | \ x 6 + // | \ x 5 + // | \1x2x3x4 + // | + // + // The top-left neighbor array is updated with the reversed samples + // from the right column and bottom row of the source block + // // Index = originX - originY */ @@ -570,9 +570,9 @@ void NeighborArrayUnitModeWrite( originX, originY + (blockHeight - 1)); - // Copy bottom-row + right-column + // Copy bottom-row + right-column // *Note - start from the bottom-left corner - dstPtr = naUnitPtr->topLeftArray + + dstPtr = naUnitPtr->topLeftArray + naOffset * naUnitSize; count = ((blockWidth + blockHeight) >> naUnitPtr->granularityTopLeftLog2) - 1; @@ -580,7 +580,7 @@ void NeighborArrayUnitModeWrite( for(idx = 0; idx < count; ++idx) { EB_MEMCPY(dstPtr, value, naUnitSize); - + dstPtr += naUnitSize; } } @@ -597,55 +597,55 @@ void NeighborArrayUnitDepthSkipWrite(//NeighborArrayUnitDepthWrite( EB_U32 originY, EB_U32 blockSize) { - + EB_U8 *dstPtr; EB_U8 *naUnittopArray; - EB_U8 *naUnitleftArray; + EB_U8 *naUnitleftArray; EB_U32 count; - - naUnittopArray = naUnitPtr->topArray; - naUnitleftArray = naUnitPtr->leftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + naUnittopArray = naUnitPtr->topArray; + naUnitleftArray = naUnitPtr->leftArray; + + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // | | + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX dstPtr = naUnittopArray + (originX >> 3); count = blockSize >> 3; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY + - dstPtr = naUnitleftArray + (originY >> 3); - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); return; } @@ -660,56 +660,56 @@ void NeighborArrayUnitIntraWrite(//NeighborArrayUnitDepthWrite( EB_U32 originY, EB_U32 blockSize) { - + EB_U8 *dstPtr; EB_U8 *naUnittopArray; - EB_U8 *naUnitleftArray; + EB_U8 *naUnitleftArray; EB_U32 count; - - naUnittopArray = naUnitPtr->topArray; - naUnitleftArray = naUnitPtr->leftArray; + + naUnittopArray = naUnitPtr->topArray; + naUnitleftArray = naUnitPtr->leftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // | | + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX dstPtr = naUnittopArray + (originX >> 2); count = blockSize >> 2; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY + - dstPtr = naUnitleftArray + (originY >> 2); - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); return; } @@ -727,76 +727,76 @@ void NeighborArrayUnitModeTypeWrite( { EB_U8 *dstPtr; EB_U8 *naUnitTopArray; - EB_U8 *naUnitLeftArray; - EB_U8 *naUnitTopLeftArray; + EB_U8 *naUnitLeftArray; + EB_U8 *naUnitTopLeftArray; EB_U32 count; EB_U32 naOffset; - naUnitTopArray = naUnitPtr->topArray; - naUnitLeftArray = naUnitPtr->leftArray; - naUnitTopLeftArray = naUnitPtr->topLeftArray; + naUnitTopArray = naUnitPtr->topArray; + naUnitLeftArray = naUnitPtr->leftArray; + naUnitTopLeftArray = naUnitPtr->topLeftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // | | + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX naOffset = originX >> 2; dstPtr = naUnitTopArray + naOffset; count = blockSize >> 2; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY naOffset = originY >> 2; dstPtr = naUnitLeftArray + naOffset; - EB_MEMSET(dstPtr, *value, count); - - + EB_MEMSET(dstPtr, *value, count); + + /* // Top-left Neighbor Array - // + // // 4-5--6--7------------ - // 3 \ \ - // 2 \ \ - // 1 \ \ - // |\ xxxxxx7 - // | \ x 6 - // | \ x 5 - // | \1x2x3x4 - // | - // - // The top-left neighbor array is updated with the reversed samples - // from the right column and bottom row of the source block - // + // 3 \ \ + // 2 \ \ + // 1 \ \ + // |\ xxxxxx7 + // | \ x 6 + // | \ x 5 + // | \1x2x3x4 + // | + // + // The top-left neighbor array is updated with the reversed samples + // from the right column and bottom row of the source block + // // Index = originX - originY */ @@ -805,12 +805,12 @@ void NeighborArrayUnitModeTypeWrite( originX, originY + (blockSize - 1)); - // Copy bottom-row + right-column + // Copy bottom-row + right-column // *Note - start from the bottom-left corner dstPtr = naUnitTopLeftArray + naOffset; count = ((blockSize + blockSize) >> 2) - 1; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); return; @@ -825,7 +825,7 @@ void NeighborArrayUnitMvWrite( EB_U8 *value, EB_U32 originX, EB_U32 originY, - EB_U32 blockSize) + EB_U32 blockSize) { EB_U32 idx; EB_U8 *dstPtr; @@ -835,34 +835,34 @@ void NeighborArrayUnitMvWrite( EB_U32 count; EB_U32 naOffset; - EB_U32 naUnitSize; - - naUnitSize = naUnitPtr->unitSize; - naUnittopArray = naUnitPtr->topArray; - naUnitleftArray = naUnitPtr->leftArray; - naUnittopLeftArray = naUnitPtr->topLeftArray; + EB_U32 naUnitSize; + naUnitSize = naUnitPtr->unitSize; + naUnittopArray = naUnitPtr->topArray; + naUnitleftArray = naUnitPtr->leftArray; + naUnittopLeftArray = naUnitPtr->topLeftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ + // | | // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX naOffset = originX >> 2 ; - dstPtr = naUnittopArray + + dstPtr = naUnittopArray + naOffset * naUnitSize; - + //dstStep = naUnitSize; count = blockSize >> 2; @@ -875,24 +875,24 @@ void NeighborArrayUnitMvWrite( // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY naOffset = originY >> 2 ; - dstPtr = naUnitleftArray + + dstPtr = naUnitleftArray + naOffset * naUnitSize; @@ -903,23 +903,23 @@ void NeighborArrayUnitMvWrite( dstPtr += naUnitSize; } - + /* // Top-left Neighbor Array - // + // // 4-5--6--7------------ - // 3 \ \ - // 2 \ \ - // 1 \ \ - // |\ xxxxxx7 - // | \ x 6 - // | \ x 5 - // | \1x2x3x4 - // | - // - // The top-left neighbor array is updated with the reversed samples - // from the right column and bottom row of the source block - // + // 3 \ \ + // 2 \ \ + // 1 \ \ + // |\ xxxxxx7 + // | \ x 6 + // | \ x 5 + // | \1x2x3x4 + // | + // + // The top-left neighbor array is updated with the reversed samples + // from the right column and bottom row of the source block + // // Index = originX - originY */ @@ -928,9 +928,9 @@ void NeighborArrayUnitMvWrite( originX, originY + (blockSize - 1)); - // Copy bottom-row + right-column + // Copy bottom-row + right-column // *Note - start from the bottom-left corner - dstPtr = naUnittopLeftArray + + dstPtr = naUnittopLeftArray + naOffset * naUnitSize; count = ((blockSize + blockSize) >> 2) - 1; @@ -938,7 +938,7 @@ void NeighborArrayUnitMvWrite( for(idx = 0; idx < count; ++idx) { EB_MEMCPY(dstPtr, value, naUnitSize); - + dstPtr += naUnitSize; } diff --git a/Source/Lib/Codec/EbNeighborArrays.h b/Source/Lib/Codec/EbNeighborArrays.h index 09462762e..73e1315e0 100644 --- a/Source/Lib/Codec/EbNeighborArrays.h +++ b/Source/Lib/Codec/EbNeighborArrays.h @@ -34,7 +34,7 @@ typedef enum NEIGHBOR_ARRAY_TYPE #define NEIGHBOR_ARRAY_UNIT_FULL_MASK (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK | NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK) #define NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK) -typedef struct NeighborArrayUnit_s +typedef struct NeighborArrayUnit_s { EB_U8 *leftArray; EB_U8 *topArray; @@ -42,7 +42,7 @@ typedef struct NeighborArrayUnit_s EB_U16 leftArraySize; EB_U16 topArraySize; EB_U16 topLeftArraySize; - EB_U8 unitSize; + EB_U8 unitSize; EB_U8 granularityNormal; EB_U8 granularityNormalLog2; EB_U8 granularityTopLeft; @@ -54,7 +54,7 @@ extern EB_ERRORTYPE NeighborArrayUnitCtor( NeighborArrayUnit_t **naUnitDblPtr, EB_U32 maxPictureWidth, EB_U32 maxPictureHeight, - EB_U32 unitSize, + EB_U32 unitSize, EB_U32 granularityNormal, EB_U32 granularityTopLeft, EB_U32 typeMask); @@ -78,7 +78,7 @@ extern EB_U32 GetNeighborArrayUnitTopLeftIndex( extern void NeighborArrayUnitSampleWrite( NeighborArrayUnit_t *naUnitPtr, - EB_U8 *srcPtr, + EB_U8 *srcPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -90,7 +90,7 @@ extern void NeighborArrayUnitSampleWrite( extern void NeighborArrayUnit16bitSampleWrite( NeighborArrayUnit_t *naUnitPtr, - EB_U16 *srcPtr, + EB_U16 *srcPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, diff --git a/Source/Lib/Codec/EbPackUnPack.h b/Source/Lib/Codec/EbPackUnPack.h index 0b07eabac..33549c7f1 100644 --- a/Source/Lib/Codec/EbPackUnPack.h +++ b/Source/Lib/Codec/EbPackUnPack.h @@ -30,40 +30,40 @@ EB_ENC_Pack2D_TYPE Pack2D_funcPtrArray_16Bit_SRC[2][EB_ASM_TYPE_TOTAL] = // C_DEFAULT EB_ENC_msbPack2D, // AVX2 - EB_ENC_msbPack2D, + EB_ENC_msbPack2D, }, { // C_DEFAULT EB_ENC_msbPack2D, // AVX2 - EB_ENC_msbPack2D_AVX2_INTRIN_AL,//EB_ENC_msbPack2D_AVX2 + EB_ENC_msbPack2D_AVX2_INTRIN_AL,//EB_ENC_msbPack2D_AVX2 } }; EB_ENC_Pack2D_TYPE CompressedPack_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - CompressedPackmsb, - // AVX2 - CompressedPackmsb_AVX2_INTRIN, + // C_DEFAULT + CompressedPackmsb, + // AVX2 + CompressedPackmsb_AVX2_INTRIN, }; typedef void(*COMPPack_TYPE)( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); COMPPack_TYPE Convert_Unpack_CPack_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - CPack_C, - // AVX2 - CPack_AVX2_INTRIN, + // C_DEFAULT + CPack_C, + // AVX2 + CPack_AVX2_INTRIN, }; @@ -81,13 +81,13 @@ EB_ENC_UnPack2D_TYPE UnPack2D_funcPtrArray_16Bit[2][EB_ASM_TYPE_TOTAL] = { { // C_DEFAULT - EB_ENC_msbUnPack2D, + EB_ENC_msbUnPack2D, // AVX2 - EB_ENC_msbUnPack2D, + EB_ENC_msbUnPack2D, }, { // C_DEFAULT - EB_ENC_msbUnPack2D, + EB_ENC_msbUnPack2D, // AVX512 #ifndef NON_AVX512_SUPPORT EB_ENC_msbUnPack2D_AVX512_INTRIN, @@ -104,16 +104,16 @@ typedef void(*EB_ENC_UnpackAvg_TYPE)( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height ); EB_ENC_UnpackAvg_TYPE UnPackAvg_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT - UnpackAvg, + UnpackAvg, // AVX2 - UnpackAvg_AVX2_INTRIN,//UnpackAvg_SSE2_INTRIN, - + UnpackAvg_AVX2_INTRIN,//UnpackAvg_SSE2_INTRIN, + }; typedef void(*EB_ENC_UnpackAvgSub_TYPE)( EB_U16 *ref16L0, @@ -121,16 +121,16 @@ typedef void(*EB_ENC_UnpackAvgSub_TYPE)( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, - EB_U32 height ); + EB_U32 height ); EB_ENC_UnpackAvgSub_TYPE UnPackAvgSafeSub_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT - UnpackAvgSafeSub, + UnpackAvgSafeSub, // AVX2 SafeSub - UnpackAvgSafeSub_AVX2_INTRIN - + UnpackAvgSafeSub_AVX2_INTRIN + }; typedef void(*EB_ENC_UnPack8BitData_TYPE)( @@ -150,7 +150,7 @@ EB_ENC_UnPack8BitData_TYPE UnPack8BIT_funcPtrArray_16Bit[2][EB_ASM_TYPE_TOTAL] = // C_DEFAULT UnPack8BitData, // AVX2 - EB_ENC_UnPack8BitData_SSE2_INTRIN, + EB_ENC_UnPack8BitData_SSE2_INTRIN, } }; typedef void(*EB_ENC_UnPack8BitDataSUB_TYPE)( @@ -163,10 +163,10 @@ typedef void(*EB_ENC_UnPack8BitDataSUB_TYPE)( ); EB_ENC_UnPack8BitDataSUB_TYPE UnPack8BITSafeSub_funcPtrArray_16Bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - UnPack8BitDataSafeSub, + // C_DEFAULT + UnPack8BitDataSafeSub, // SSE2 - EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN + EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN }; #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPacketizationProcess.h b/Source/Lib/Codec/EbPacketizationProcess.h index ced44a311..059aa3134 100644 --- a/Source/Lib/Codec/EbPacketizationProcess.h +++ b/Source/Lib/Codec/EbPacketizationProcess.h @@ -19,7 +19,7 @@ typedef struct EbPPSConfig_s { EB_U8 ppsId; EB_U8 constrainedFlag; - + } EbPPSConfig_t; /************************************** @@ -31,7 +31,7 @@ typedef struct PacketizationContext_s EbFifo_t *rateControlTasksOutputFifoPtr; EbPPSConfig_t *ppsConfig; EbFifo_t *pictureManagerOutputFifoPtr; // to picture-manager - + } PacketizationContext_t; /************************************** @@ -43,8 +43,8 @@ extern EB_ERRORTYPE PacketizationContextCtor( EbFifo_t *rateControlTasksOutputFifoPtr, EbFifo_t *pictureManagerOutputFifoPtr ); - - + + extern void* PacketizationKernel(void *inputPtr); #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbPacketizationReorderQueue.h b/Source/Lib/Codec/EbPacketizationReorderQueue.h index f5a041f2d..671887951 100644 --- a/Source/Lib/Codec/EbPacketizationReorderQueue.h +++ b/Source/Lib/Codec/EbPacketizationReorderQueue.h @@ -24,7 +24,7 @@ extern "C" { } PicTimingEntry_t; typedef struct PacketizationReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *outputStreamWrapperPtr; EB_U64 startTimeSeconds; @@ -36,13 +36,13 @@ typedef struct PacketizationReorderEntry_s { EB_U32 startSplicing; EB_U64 fillerBitsSent; EB_U64 fillerBitsFinal; -} PacketizationReorderEntry_t; +} PacketizationReorderEntry_t; -extern EB_ERRORTYPE PacketizationReorderEntryCtor( +extern EB_ERRORTYPE PacketizationReorderEntryCtor( PacketizationReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); - + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbPictureAnalysisProcess.c b/Source/Lib/Codec/EbPictureAnalysisProcess.c index fe1827962..c3cbb8f25 100644 --- a/Source/Lib/Codec/EbPictureAnalysisProcess.c +++ b/Source/Lib/Codec/EbPictureAnalysisProcess.c @@ -25,17 +25,17 @@ #include "EbComputeMean_SSE2.h" #include "EbCombinedAveragingSAD_Intrinsic_AVX2.h" -#define VARIANCE_PRECISION 16 +#define VARIANCE_PRECISION 16 #define LCU_LOW_VAR_TH 5 #define PIC_LOW_VAR_PERCENTAGE_TH 60 -#define FLAT_MAX_VAR 50 -#define FLAT_MAX_VAR_DECIM (50-00) -#define NOISE_MIN_LEVEL_0 70000//120000 +#define FLAT_MAX_VAR 50 +#define FLAT_MAX_VAR_DECIM (50-00) +#define NOISE_MIN_LEVEL_0 70000//120000 #define NOISE_MIN_LEVEL_DECIM_0 (70000+000000)//(120000+000000) -#define NOISE_MIN_LEVEL_1 120000 -#define NOISE_MIN_LEVEL_DECIM_1 (120000+000000) -#define DENOISER_QP_TH 29 -#define DENOISER_BITRATE_TH 14000000 +#define NOISE_MIN_LEVEL_1 120000 +#define NOISE_MIN_LEVEL_DECIM_1 (120000+000000) +#define DENOISER_QP_TH 29 +#define DENOISER_BITRATE_TH 14000000 #define SAMPLE_THRESHOLD_PRECENT_BORDER_LINE 15 #define SAMPLE_THRESHOLD_PRECENT_TWO_BORDER_LINES 10 @@ -43,60 +43,60 @@ * Picture Analysis Context Constructor ************************************************/ EB_ERRORTYPE PictureAnalysisContextCtor( - EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, - EB_BOOL denoiseFlag, + EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, + EB_BOOL denoiseFlag, PictureAnalysisContext_t **contextDblPtr, EbFifo_t *resourceCoordinationResultsInputFifoPtr, EbFifo_t *pictureAnalysisResultsOutputFifoPtr, - EB_U16 lcuTotalCount) + EB_U16 lcuTotalCount) { - PictureAnalysisContext_t *contextPtr; - EB_MALLOC(PictureAnalysisContext_t*, contextPtr, sizeof(PictureAnalysisContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; + PictureAnalysisContext_t *contextPtr; + EB_MALLOC(PictureAnalysisContext_t*, contextPtr, sizeof(PictureAnalysisContext_t), EB_N_PTR); + *contextDblPtr = contextPtr; - contextPtr->resourceCoordinationResultsInputFifoPtr = resourceCoordinationResultsInputFifoPtr; - contextPtr->pictureAnalysisResultsOutputFifoPtr = pictureAnalysisResultsOutputFifoPtr; + contextPtr->resourceCoordinationResultsInputFifoPtr = resourceCoordinationResultsInputFifoPtr; + contextPtr->pictureAnalysisResultsOutputFifoPtr = pictureAnalysisResultsOutputFifoPtr; - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - if (denoiseFlag == EB_TRUE){ + if (denoiseFlag == EB_TRUE){ - //denoised + //denoised // If 420/422, re-use luma for chroma // If 444, re-use luma for Cr if (inputPictureBufferDescInitData->colorFormat != EB_YUV444) { - inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; + inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; } else { - inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG | PICTURE_BUFFER_DESC_Cb_FLAG; + inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG | PICTURE_BUFFER_DESC_Cb_FLAG; } - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(contextPtr->denoisedPicturePtr), - (EB_PTR)inputPictureBufferDescInitData); + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(contextPtr->denoisedPicturePtr), + (EB_PTR)inputPictureBufferDescInitData); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } if (inputPictureBufferDescInitData->colorFormat != EB_YUV444) { - contextPtr->denoisedPicturePtr->bufferCb = contextPtr->denoisedPicturePtr->bufferY; - contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY + contextPtr->denoisedPicturePtr->chromaSize; + contextPtr->denoisedPicturePtr->bufferCb = contextPtr->denoisedPicturePtr->bufferY; + contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY + contextPtr->denoisedPicturePtr->chromaSize; } else { - contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY; + contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY; } - // noise - inputPictureBufferDescInitData->maxHeight = MAX_LCU_SIZE; - inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; + // noise + inputPictureBufferDescInitData->maxHeight = MAX_LCU_SIZE; + inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(contextPtr->noisePicturePtr), - (EB_PTR)inputPictureBufferDescInitData); + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(contextPtr->noisePicturePtr), + (EB_PTR)inputPictureBufferDescInitData); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + } EB_MALLOC(EB_U16**, contextPtr->grad, sizeof(EB_U16*) * lcuTotalCount, EB_N_PTR); for (EB_U16 lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { @@ -104,67 +104,67 @@ EB_ERRORTYPE PictureAnalysisContextCtor( } - return EB_ErrorNone; + return EB_ErrorNone; } static void DownSampleChroma(EbPictureBufferDesc_t* inputPicturePtr, EbPictureBufferDesc_t* outputPicturePtr) { - EB_U32 inputColorFormat = inputPicturePtr->colorFormat; - EB_U16 inputSubWidthCMinus1 = (inputColorFormat == EB_YUV444 ? 1 : 2) - 1; - EB_U16 inputSubHeightCMinus1 = (inputColorFormat >= EB_YUV422 ? 1 : 2) - 1; + EB_U32 inputColorFormat = inputPicturePtr->colorFormat; + EB_U16 inputSubWidthCMinus1 = (inputColorFormat == EB_YUV444 ? 1 : 2) - 1; + EB_U16 inputSubHeightCMinus1 = (inputColorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 outputColorFormat = outputPicturePtr->colorFormat; - EB_U16 outputSubWidthCMinus1 = (outputColorFormat == EB_YUV444 ? 1 : 2) - 1; - EB_U16 outputSubHeightCMinus1 = (outputColorFormat >= EB_YUV422 ? 1 : 2) - 1; + EB_U32 outputColorFormat = outputPicturePtr->colorFormat; + EB_U16 outputSubWidthCMinus1 = (outputColorFormat == EB_YUV444 ? 1 : 2) - 1; + EB_U16 outputSubHeightCMinus1 = (outputColorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 strideIn, strideOut; - EB_U32 inputOriginIndex, outputOriginIndex; + EB_U32 strideIn, strideOut; + EB_U32 inputOriginIndex, outputOriginIndex; - EB_U8 *ptrIn; - EB_U8 *ptrOut; + EB_U8 *ptrIn; + EB_U8 *ptrOut; - EB_U32 ii, jj; + EB_U32 ii, jj; - //Cb - { - strideIn = inputPicturePtr->strideCb; - inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + + //Cb + { + strideIn = inputPicturePtr->strideCb; + inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + (inputPicturePtr->originY >> inputSubHeightCMinus1) * inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); - strideOut = outputPicturePtr->strideCb; - outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + + strideOut = outputPicturePtr->strideCb; + outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + (outputPicturePtr->originY >> outputSubHeightCMinus1) * outputPicturePtr->strideCb; - ptrOut = &(outputPicturePtr->bufferCb[outputOriginIndex]); + ptrOut = &(outputPicturePtr->bufferCb[outputOriginIndex]); - for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { - for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { - ptrOut[ii + jj * strideOut] = + for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { + for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { + ptrOut[ii + jj * strideOut] = ptrIn[(ii << (1 - inputSubWidthCMinus1)) + (jj << (1 - inputSubHeightCMinus1)) * strideIn]; - } - } + } + } - } + } - //Cr - { - strideIn = inputPicturePtr->strideCr; - inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + (inputPicturePtr->originY >> inputSubHeightCMinus1) * inputPicturePtr->strideCr; - ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); + //Cr + { + strideIn = inputPicturePtr->strideCr; + inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + (inputPicturePtr->originY >> inputSubHeightCMinus1) * inputPicturePtr->strideCr; + ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); - strideOut = outputPicturePtr->strideCr; - outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + (outputPicturePtr->originY >> outputSubHeightCMinus1) * outputPicturePtr->strideCr; - ptrOut = &(outputPicturePtr->bufferCr[outputOriginIndex]); + strideOut = outputPicturePtr->strideCr; + outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + (outputPicturePtr->originY >> outputSubHeightCMinus1) * outputPicturePtr->strideCr; + ptrOut = &(outputPicturePtr->bufferCr[outputOriginIndex]); - for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { - for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { - ptrOut[ii + jj * strideOut] = + for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { + for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { + ptrOut[ii + jj * strideOut] = ptrIn[(ii << (1 - inputSubWidthCMinus1)) + (jj << (1 - inputSubHeightCMinus1)) * strideIn]; - } - } - } + } + } + } } /************************************************ @@ -176,30 +176,30 @@ static void DownSampleChroma(EbPictureBufferDesc_t* inputPicturePtr, EbPictureBu * decimates the input ********************************************/ void Decimation2D( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputStride, // input parameter, input stride - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight, // input parameter, input area height - EB_U8 * decimSamples, // output parameter, decimated samples Ptr - EB_U32 decimStride, // input parameter, output stride - EB_U32 decimStep) // input parameter, area height + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputStride, // input parameter, input stride + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight, // input parameter, input area height + EB_U8 * decimSamples, // output parameter, decimated samples Ptr + EB_U32 decimStride, // input parameter, output stride + EB_U32 decimStep) // input parameter, area height { - EB_U32 horizontalIndex; - EB_U32 verticalIndex; + EB_U32 horizontalIndex; + EB_U32 verticalIndex; - for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { - for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { + for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { + for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { - decimSamples[(horizontalIndex >> (decimStep >> 1))] = inputSamples[horizontalIndex]; + decimSamples[(horizontalIndex >> (decimStep >> 1))] = inputSamples[horizontalIndex]; - } - inputSamples += (inputStride << (decimStep >> 1)); - decimSamples += decimStride; - } + } + inputSamples += (inputStride << (decimStep >> 1)); + decimSamples += decimStride; + } - return; + return; } /******************************************** @@ -207,223 +207,223 @@ void Decimation2D( * creates n-bins histogram for the input ********************************************/ static void CalculateHistogram( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight, // input parameter, input area height - EB_U32 stride, // input parameter, input stride - EB_U8 decimStep, // input parameter, area height - EB_U32 *histogram, // output parameter, output histogram - EB_U64 *sum) + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight, // input parameter, input area height + EB_U32 stride, // input parameter, input stride + EB_U8 decimStep, // input parameter, area height + EB_U32 *histogram, // output parameter, output histogram + EB_U64 *sum) { - EB_U32 horizontalIndex; - EB_U32 verticalIndex; - *sum = 0; + EB_U32 horizontalIndex; + EB_U32 verticalIndex; + *sum = 0; - for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { - for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { - ++(histogram[inputSamples[horizontalIndex]]); - *sum += inputSamples[horizontalIndex]; - } + for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { + for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { + ++(histogram[inputSamples[horizontalIndex]]); + *sum += inputSamples[horizontalIndex]; + } inputSamples += (stride << (decimStep >> 1)); - } + } - return; + return; } static EB_U64 ComputeVariance32x32( - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U64 *variance8x8) + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U64 *variance8x8) { - EB_U32 blockIndex; + EB_U32 blockIndex; + + EB_U64 meanOf8x8Blocks[16]; + EB_U64 meanOf8x8SquaredValuesBlocks[16]; + + EB_U64 meanOf16x16Blocks[4]; + EB_U64 meanOf16x16SquaredValuesBlocks[4]; + + EB_U64 meanOf32x32Blocks; + EB_U64 meanOf32x32SquaredValuesBlocks; + ///////////////////////////////////////////// + // (0,0) + blockIndex = inputLumaOriginIndex; + + meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (0,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (0,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (0,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + + + // (1,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); + meanOf8x8Blocks[4] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[4] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (1,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[5] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[5] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (1,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[6] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[6] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (1,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[7] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[7] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + + + // (2,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 4); + meanOf8x8Blocks[8] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[8] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (2,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[9] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[9] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (2,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[10] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[10] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (2,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[11] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[11] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + + + // (3,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3) + (inputPaddedPicturePtr->strideY << 4); + meanOf8x8Blocks[12] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[12] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (3,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[13] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[13] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (3,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[14] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[14] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (3,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[15] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[15] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + + ///////////////////////////////////////////// + + variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); + variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); + variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); + variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); + variance8x8[4] = meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4]); + variance8x8[5] = meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5]); + variance8x8[6] = meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6]); + variance8x8[7] = meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7]); + variance8x8[8] = meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8]); + variance8x8[9] = meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9]); + variance8x8[10] = meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10]); + variance8x8[11] = meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11]); + variance8x8[12] = meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12]); + variance8x8[13] = meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13]); + variance8x8[14] = meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14]); + variance8x8[15] = meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15]); - EB_U64 meanOf8x8Blocks[16]; - EB_U64 meanOf8x8SquaredValuesBlocks[16]; + // 16x16 + meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; + meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; + meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; + meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - EB_U64 meanOf16x16Blocks[4]; - EB_U64 meanOf16x16SquaredValuesBlocks[4]; - - EB_U64 meanOf32x32Blocks; - EB_U64 meanOf32x32SquaredValuesBlocks; - ///////////////////////////////////////////// - // (0,0) - blockIndex = inputLumaOriginIndex; - - meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (0,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (0,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (0,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - - - // (1,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); - meanOf8x8Blocks[4] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[4] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (1,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[5] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[5] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (1,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[6] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[6] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (1,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[7] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[7] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - - - // (2,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 4); - meanOf8x8Blocks[8] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[8] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (2,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[9] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[9] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (2,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[10] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[10] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (2,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[11] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[11] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - - - // (3,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3) + (inputPaddedPicturePtr->strideY << 4); - meanOf8x8Blocks[12] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[12] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (3,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[13] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[13] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (3,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[14] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[14] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - // (3,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[15] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[15] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - - - ///////////////////////////////////////////// - - variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); - variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); - variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); - variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); - variance8x8[4] = meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4]); - variance8x8[5] = meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5]); - variance8x8[6] = meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6]); - variance8x8[7] = meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7]); - variance8x8[8] = meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8]); - variance8x8[9] = meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9]); - variance8x8[10] = meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10]); - variance8x8[11] = meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11]); - variance8x8[12] = meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12]); - variance8x8[13] = meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13]); - variance8x8[14] = meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14]); - variance8x8[15] = meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15]); - - // 16x16 - meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; - meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; - meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; - meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - - - meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; - meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; - meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; - meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; - - // 32x32 - meanOf32x32Blocks = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[2] + meanOf16x16Blocks[3]) >> 2; - - - meanOf32x32SquaredValuesBlocks = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3]) >> 2; - - - return (meanOf32x32SquaredValuesBlocks - (meanOf32x32Blocks * meanOf32x32Blocks)); + + meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; + meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; + meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; + meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; + + // 32x32 + meanOf32x32Blocks = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[2] + meanOf16x16Blocks[3]) >> 2; + + + meanOf32x32SquaredValuesBlocks = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3]) >> 2; + + + return (meanOf32x32SquaredValuesBlocks - (meanOf32x32Blocks * meanOf32x32Blocks)); } static EB_U64 ComputeVariance16x16( - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U64 *variance8x8) + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U64 *variance8x8) { - EB_U32 blockIndex; + EB_U32 blockIndex; - EB_U64 meanOf8x8Blocks[4]; - EB_U64 meanOf8x8SquaredValuesBlocks[4]; + EB_U64 meanOf8x8Blocks[4]; + EB_U64 meanOf8x8SquaredValuesBlocks[4]; - EB_U64 meanOf16x16Blocks; - EB_U64 meanOf16x16SquaredValuesBlocks; + EB_U64 meanOf16x16Blocks; + EB_U64 meanOf16x16SquaredValuesBlocks; - // (0,0) - blockIndex = inputLumaOriginIndex; + // (0,0) + blockIndex = inputLumaOriginIndex; - meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (0,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (0,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); - meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); + meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); - variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); - variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); - variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); + variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); + variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); + variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); + variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); - // 16x16 - meanOf16x16Blocks = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[2] + meanOf8x8Blocks[3]) >> 2; - meanOf16x16SquaredValuesBlocks = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3]) >> 2; + // 16x16 + meanOf16x16Blocks = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[2] + meanOf8x8Blocks[3]) >> 2; + meanOf16x16SquaredValuesBlocks = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3]) >> 2; - return (meanOf16x16SquaredValuesBlocks - (meanOf16x16Blocks * meanOf16x16Blocks)); + return (meanOf16x16SquaredValuesBlocks - (meanOf16x16Blocks * meanOf16x16Blocks)); } /******************************************* @@ -434,29 +434,29 @@ does not store data for every block, just returns the 64x64 data point *******************************************/ static EB_U64 ComputeVariance64x64( - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U64 *variance32x32) + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U64 *variance32x32) { - EB_U32 blockIndex; + EB_U32 blockIndex; - EB_U64 meanOf8x8Blocks[64]; - EB_U64 meanOf8x8SquaredValuesBlocks[64]; + EB_U64 meanOf8x8Blocks[64]; + EB_U64 meanOf8x8SquaredValuesBlocks[64]; - EB_U64 meanOf16x16Blocks[16]; - EB_U64 meanOf16x16SquaredValuesBlocks[16]; + EB_U64 meanOf16x16Blocks[16]; + EB_U64 meanOf16x16SquaredValuesBlocks[16]; - EB_U64 meanOf32x32Blocks[4]; - EB_U64 meanOf32x32SquaredValuesBlocks[4]; + EB_U64 meanOf32x32Blocks[4]; + EB_U64 meanOf32x32SquaredValuesBlocks[4]; - EB_U64 meanOf64x64Blocks; - EB_U64 meanOf64x64SquaredValuesBlocks; + EB_U64 meanOf64x64Blocks; + EB_U64 meanOf64x64SquaredValuesBlocks; - // (0,0) - blockIndex = inputLumaOriginIndex; - const EB_U16 strideY = inputPaddedPicturePtr->strideY; + // (0,0) + blockIndex = inputLumaOriginIndex; + const EB_U16 strideY = inputPaddedPicturePtr->strideY; if (!!(ASM_TYPES & AVX2_MASK)) { @@ -561,460 +561,460 @@ static EB_U64 ComputeVariance64x64( } else{ meanOf8x8Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[0] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[1] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[2] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[3] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[4] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[5] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[6] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[7] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,0) - blockIndex = inputLumaOriginIndex + (strideY << 3); - meanOf8x8Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[8] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[9] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[10] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[11] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[12] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[13] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[14] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[15] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,0) - blockIndex = inputLumaOriginIndex + (strideY << 4); - meanOf8x8Blocks[16] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[16] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[17] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[17] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[18] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[18] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[19] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[19] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - /// (2,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[20] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[20] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[21] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[21] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[22] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[22] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[23] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[23] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,0) - blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4); - meanOf8x8Blocks[24] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[24] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[25] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[25] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[26] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[26] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[27] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[27] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[28] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[28] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[29] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[29] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[30] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[30] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[31] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[31] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,0) - blockIndex = inputLumaOriginIndex + (strideY << 5); - meanOf8x8Blocks[32] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[32] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[33] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[33] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[34] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[34] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[35] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[35] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[36] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[36] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[37] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[37] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[38] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[38] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[39] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[39] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,0) - blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 5); - meanOf8x8Blocks[40] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[40] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[41] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[41] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[42] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[42] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[43] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[43] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[44] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[44] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[45] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[45] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[46] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[46] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[47] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[47] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,0) - blockIndex = inputLumaOriginIndex + (strideY << 4) + (strideY << 5); - meanOf8x8Blocks[48] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[48] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[49] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[49] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[50] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[50] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[51] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[51] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[52] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[52] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[53] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[53] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[54] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[54] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[55] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[55] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,0) - blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4) + (strideY << 5); - meanOf8x8Blocks[56] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[56] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[57] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[57] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[58] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[58] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[59] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[59] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[60] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[60] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[61] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[61] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[62] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[62] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[63] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[63] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - + meanOf8x8SquaredValuesBlocks[0] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[1] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[2] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[3] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[4] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[5] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[6] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[7] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,0) + blockIndex = inputLumaOriginIndex + (strideY << 3); + meanOf8x8Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[8] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[9] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[10] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[11] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[12] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[13] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[14] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[15] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,0) + blockIndex = inputLumaOriginIndex + (strideY << 4); + meanOf8x8Blocks[16] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[16] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[17] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[17] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[18] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[18] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[19] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[19] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + /// (2,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[20] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[20] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[21] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[21] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[22] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[22] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[23] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[23] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,0) + blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4); + meanOf8x8Blocks[24] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[24] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[25] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[25] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[26] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[26] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[27] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[27] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[28] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[28] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[29] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[29] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[30] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[30] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[31] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[31] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,0) + blockIndex = inputLumaOriginIndex + (strideY << 5); + meanOf8x8Blocks[32] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[32] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[33] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[33] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[34] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[34] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[35] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[35] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[36] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[36] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[37] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[37] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[38] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[38] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[39] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[39] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,0) + blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 5); + meanOf8x8Blocks[40] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[40] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[41] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[41] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[42] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[42] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[43] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[43] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[44] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[44] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[45] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[45] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[46] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[46] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[47] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[47] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,0) + blockIndex = inputLumaOriginIndex + (strideY << 4) + (strideY << 5); + meanOf8x8Blocks[48] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[48] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[49] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[49] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[50] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[50] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[51] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[51] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[52] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[52] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[53] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[53] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[54] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[54] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[55] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[55] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,0) + blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4) + (strideY << 5); + meanOf8x8Blocks[56] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[56] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[57] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[57] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[58] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[58] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[59] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[59] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[60] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[60] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[61] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[61] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[62] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[62] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[63] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[63] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + } - // 16x16 - meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; - meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; - meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; - meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; + // 16x16 + meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; + meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; + meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; + meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; - meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; - meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; - meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; + meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; + meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; + meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; + meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; - meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; - meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; - meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; - meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; + meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; + meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; + meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; + meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; - meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; - meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; - meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; - meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; + meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; + meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; + meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; + meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; - meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; - meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; - meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; - meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; + meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; + meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; + meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; + meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; - meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; - meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; - meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; - meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; + meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; + meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; + meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; + meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; - meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; - meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; - meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; - meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; + meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; + meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; + meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; + meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; - meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; - meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; - meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; - meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; + meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; + meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; + meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; + meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; - // 32x32 - meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; - meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; - meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; - meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; + // 32x32 + meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; + meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; + meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; + meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; - meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; - meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; - meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; - meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; + meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; + meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; + meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; + meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; - variance32x32[0] = meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0]); - variance32x32[1] = meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1]); - variance32x32[2] = meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2]); - variance32x32[3] = meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3]); + variance32x32[0] = meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0]); + variance32x32[1] = meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1]); + variance32x32[2] = meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2]); + variance32x32[3] = meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3]); - // 64x64 - meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; - meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; + // 64x64 + meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; + meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; - return (meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)); + return (meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)); } static EB_U8 getFilteredTypes(EB_U8 *ptr, - EB_U32 stride, - EB_U8 filterType) + EB_U32 stride, + EB_U8 filterType) { - EB_U8 *p = ptr - 1 - stride; + EB_U8 *p = ptr - 1 - stride; - EB_U32 a = 0; + EB_U32 a = 0; - if (filterType == 0){ + if (filterType == 0){ - //Luma - a = (p[1] + - p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + - p[1 + 2 * stride]) / 8; + //Luma + a = (p[1] + + p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + + p[1 + 2 * stride]) / 8; - } - else if (filterType == 1){ + } + else if (filterType == 1){ a = ( 2 * p[1] + - 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - 2 * p[1 + 2 * stride] ); - + 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + 2 * p[1 + 2 * stride] ); + a = (( (EB_U32)((a *2730) >> 14) + 1) >> 1) & 0xFFFF; //fixed point version of a=a/12 to mimic x86 instruction _mm256_mulhrs_epi16; //a= (a*2730)>>15; - } - else if (filterType == 2){ + } + else if (filterType == 2){ - a = (4 * p[1] + - 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + - 4 * p[1 + 2 * stride]) / 20; - } - else if (filterType == 3){ + a = (4 * p[1] + + 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + + 4 * p[1 + 2 * stride]) / 20; + } + else if (filterType == 3){ - a = (1 * p[0] + 1 * p[1] + 1 * p[2] + - 1 * p[0 + stride] + 4 * p[1 + stride] + 1 * p[2 + stride] + - 1 * p[0 + 2 * stride] + 1 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 12; + a = (1 * p[0] + 1 * p[1] + 1 * p[2] + + 1 * p[0 + stride] + 4 * p[1 + stride] + 1 * p[2 + stride] + + 1 * p[0 + 2 * stride] + 1 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 12; - } - else if (filterType == 4){ + } + else if (filterType == 4){ - //gaussian matrix(Chroma) - a = (1 * p[0] + 2 * p[1] + 1 * p[2] + - 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; + //gaussian matrix(Chroma) + a = (1 * p[0] + 2 * p[1] + 1 * p[2] + + 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; - } - else if (filterType == 5){ + } + else if (filterType == 5){ - a = (2 * p[0] + 2 * p[1] + 2 * p[2] + - 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - 2 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 2 * p[2 + 2 * stride]) / 20; + a = (2 * p[0] + 2 * p[1] + 2 * p[2] + + 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + 2 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 2 * p[2 + 2 * stride]) / 20; - } - else if (filterType == 6){ + } + else if (filterType == 6){ - a = (4 * p[0] + 4 * p[1] + 4 * p[2] + - 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + - 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; + a = (4 * p[0] + 4 * p[1] + 4 * p[2] + + 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + + 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; - } + } - return (EB_U8)CLIP3EQ(0, 255, a); + return (EB_U8)CLIP3EQ(0, 255, a); } @@ -1023,55 +1023,55 @@ static EB_U8 getFilteredTypes(EB_U8 *ptr, * strong filter Luma. *******************************************/ void noiseExtractLumaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 strideOut; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + } - } - } - } + } + } + } } @@ -1080,88 +1080,88 @@ void noiseExtractLumaStrong( * strong filter chroma. *******************************************/ void noiseExtractChromaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 strideOut; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - //Cb - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + //Cb + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCb; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + strideIn = inputPicturePtr->strideCb; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCb; + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCb; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } - //Cr - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + //Cr + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCr; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; - ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); + strideIn = inputPicturePtr->strideCr; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; + ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; - strideOut = denoisedPicturePtr->strideCr; - ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; + strideOut = denoisedPicturePtr->strideCr; + ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } } /******************************************* @@ -1169,90 +1169,90 @@ void noiseExtractChromaStrong( * weak filter chroma. *******************************************/ void noiseExtractChromaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U32 strideOut; + EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - //Cb - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; + //Cb + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCb; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + strideIn = inputPicturePtr->strideCb; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCb; + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCb; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } - //Cr - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + //Cr + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCr; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCr; - ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); + strideIn = inputPicturePtr->strideCr; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCr; + ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCr; - strideOut = denoisedPicturePtr->strideCr; - ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCr; + strideOut = denoisedPicturePtr->strideCr; + ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } } @@ -1261,188 +1261,188 @@ void noiseExtractChromaWeak( * weak filter Luma and store noise. *******************************************/ void noiseExtractLumaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U8 *ptrNoise; - EB_U32 strideOut; + EB_U8 *ptrNoise; + EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); - ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); + ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } - } - } - } + } + } + } } void noiseExtractLumaWeakLcu( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth, lcuWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth, lcuWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U8 *ptrNoise; - EB_U32 strideOut; + EB_U8 *ptrNoise; + EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < lcuWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < lcuWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && (ii>0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1/* & ii < lcuWidth - 1*/){ + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && (ii>0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1/* & ii < lcuWidth - 1*/){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); - ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); + ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } - } - } - } + } + } + } } static EB_ERRORTYPE ZeroOutChromaBlockMean( - PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr - EB_U32 lcuCodingOrder // input parameter, LCU address - ) + PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr + EB_U32 lcuCodingOrder // input parameter, LCU address + ) { - EB_ERRORTYPE return_error = EB_ErrorNone; - // 16x16 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; - - // 32x32 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; - - // 64x64 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + // 16x16 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; + + // 32x32 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; + + // 64x64 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; + + return return_error; } @@ -1451,196 +1451,196 @@ static EB_ERRORTYPE ZeroOutChromaBlockMean( * computes the chroma block mean for 64x64, 32x32 and 16x16 CUs inside the tree block *******************************************/ static EB_ERRORTYPE ComputeChromaBlockMean( - PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 lcuCodingOrder, // input parameter, LCU address - EB_U32 inputCbOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U32 inputCrOriginIndex) // input parameter, LCU index, used to point to source/reference samples + PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 lcuCodingOrder, // input parameter, LCU address + EB_U32 inputCbOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U32 inputCrOriginIndex) // input parameter, LCU index, used to point to source/reference samples { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 cbBlockIndex, crBlockIndex; - - EB_U64 cbMeanOf16x16Blocks[16]; - EB_U64 crMeanOf16x16Blocks[16]; - - EB_U64 cbMeanOf32x32Blocks[4]; - EB_U64 crMeanOf32x32Blocks[4]; - - EB_U64 cbMeanOf64x64Blocks; - EB_U64 crMeanOf64x64Blocks; - - - // (0,0) 16x16 block - cbBlockIndex = inputCbOriginIndex; - crBlockIndex = inputCrOriginIndex; - - const EB_U16 strideCb = inputPaddedPicturePtr->strideCb; - const EB_U16 strideCr = inputPaddedPicturePtr->strideCr; - - cbMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (0,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (0,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (0,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,0) - cbBlockIndex = inputCbOriginIndex + (strideCb << 3); - crBlockIndex = inputCrOriginIndex + (strideCr << 3); - cbMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,0) - cbBlockIndex = inputCbOriginIndex + (strideCb << 4); - crBlockIndex = inputCrOriginIndex + (strideCr << 4); - cbMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,0) - cbBlockIndex = inputCbOriginIndex + (strideCb * 24); - crBlockIndex = inputCrOriginIndex + (strideCr * 24); - cbMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - - // 32x32 - cbMeanOf32x32Blocks[0] = (cbMeanOf16x16Blocks[0] + cbMeanOf16x16Blocks[1] + cbMeanOf16x16Blocks[4] + cbMeanOf16x16Blocks[5]) >> 2; - crMeanOf32x32Blocks[0] = (crMeanOf16x16Blocks[0] + crMeanOf16x16Blocks[1] + crMeanOf16x16Blocks[4] + crMeanOf16x16Blocks[5]) >> 2; - - cbMeanOf32x32Blocks[1] = (cbMeanOf16x16Blocks[2] + cbMeanOf16x16Blocks[3] + cbMeanOf16x16Blocks[6] + cbMeanOf16x16Blocks[7]) >> 2; - crMeanOf32x32Blocks[1] = (crMeanOf16x16Blocks[2] + crMeanOf16x16Blocks[3] + crMeanOf16x16Blocks[6] + crMeanOf16x16Blocks[7]) >> 2; - - - cbMeanOf32x32Blocks[2] = (cbMeanOf16x16Blocks[8] + cbMeanOf16x16Blocks[9] + cbMeanOf16x16Blocks[12] + cbMeanOf16x16Blocks[13]) >> 2; - crMeanOf32x32Blocks[2] = (crMeanOf16x16Blocks[8] + crMeanOf16x16Blocks[9] + crMeanOf16x16Blocks[12] + crMeanOf16x16Blocks[13]) >> 2; - - cbMeanOf32x32Blocks[3] = (cbMeanOf16x16Blocks[10] + cbMeanOf16x16Blocks[11] + cbMeanOf16x16Blocks[14] + cbMeanOf16x16Blocks[15]) >> 2; - crMeanOf32x32Blocks[3] = (crMeanOf16x16Blocks[10] + crMeanOf16x16Blocks[11] + crMeanOf16x16Blocks[14] + crMeanOf16x16Blocks[15]) >> 2; - - // 64x64 - cbMeanOf64x64Blocks = (cbMeanOf32x32Blocks[0] + cbMeanOf32x32Blocks[1] + cbMeanOf32x32Blocks[3] + cbMeanOf32x32Blocks[3]) >> 2; - crMeanOf64x64Blocks = (crMeanOf32x32Blocks[0] + crMeanOf32x32Blocks[1] + crMeanOf32x32Blocks[3] + crMeanOf32x32Blocks[3]) >> 2; - // 16x16 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (cbMeanOf16x16Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (cbMeanOf16x16Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (cbMeanOf16x16Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (cbMeanOf16x16Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (cbMeanOf16x16Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (cbMeanOf16x16Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (cbMeanOf16x16Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (cbMeanOf16x16Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (cbMeanOf16x16Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (cbMeanOf16x16Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (cbMeanOf16x16Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (cbMeanOf16x16Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (cbMeanOf16x16Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (cbMeanOf16x16Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (cbMeanOf16x16Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (cbMeanOf16x16Blocks[15] >> MEAN_PRECISION); - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (crMeanOf16x16Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (crMeanOf16x16Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (crMeanOf16x16Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (crMeanOf16x16Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (crMeanOf16x16Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (crMeanOf16x16Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (crMeanOf16x16Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (crMeanOf16x16Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (crMeanOf16x16Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (crMeanOf16x16Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (crMeanOf16x16Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (crMeanOf16x16Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (crMeanOf16x16Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (crMeanOf16x16Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (crMeanOf16x16Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (crMeanOf16x16Blocks[15] >> MEAN_PRECISION); - - // 32x32 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8) (cbMeanOf32x32Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8) (cbMeanOf32x32Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8) (cbMeanOf32x32Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8) (cbMeanOf32x32Blocks[3] >> MEAN_PRECISION); - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(crMeanOf32x32Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(crMeanOf32x32Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(crMeanOf32x32Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(crMeanOf32x32Blocks[3] >> MEAN_PRECISION); - - // 64x64 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (cbMeanOf64x64Blocks >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (crMeanOf64x64Blocks >> MEAN_PRECISION); - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 cbBlockIndex, crBlockIndex; + + EB_U64 cbMeanOf16x16Blocks[16]; + EB_U64 crMeanOf16x16Blocks[16]; + + EB_U64 cbMeanOf32x32Blocks[4]; + EB_U64 crMeanOf32x32Blocks[4]; + + EB_U64 cbMeanOf64x64Blocks; + EB_U64 crMeanOf64x64Blocks; + + + // (0,0) 16x16 block + cbBlockIndex = inputCbOriginIndex; + crBlockIndex = inputCrOriginIndex; + + const EB_U16 strideCb = inputPaddedPicturePtr->strideCb; + const EB_U16 strideCr = inputPaddedPicturePtr->strideCr; + + cbMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (0,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (0,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (0,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,0) + cbBlockIndex = inputCbOriginIndex + (strideCb << 3); + crBlockIndex = inputCrOriginIndex + (strideCr << 3); + cbMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,0) + cbBlockIndex = inputCbOriginIndex + (strideCb << 4); + crBlockIndex = inputCrOriginIndex + (strideCr << 4); + cbMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,0) + cbBlockIndex = inputCbOriginIndex + (strideCb * 24); + crBlockIndex = inputCrOriginIndex + (strideCr * 24); + cbMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + + // 32x32 + cbMeanOf32x32Blocks[0] = (cbMeanOf16x16Blocks[0] + cbMeanOf16x16Blocks[1] + cbMeanOf16x16Blocks[4] + cbMeanOf16x16Blocks[5]) >> 2; + crMeanOf32x32Blocks[0] = (crMeanOf16x16Blocks[0] + crMeanOf16x16Blocks[1] + crMeanOf16x16Blocks[4] + crMeanOf16x16Blocks[5]) >> 2; + + cbMeanOf32x32Blocks[1] = (cbMeanOf16x16Blocks[2] + cbMeanOf16x16Blocks[3] + cbMeanOf16x16Blocks[6] + cbMeanOf16x16Blocks[7]) >> 2; + crMeanOf32x32Blocks[1] = (crMeanOf16x16Blocks[2] + crMeanOf16x16Blocks[3] + crMeanOf16x16Blocks[6] + crMeanOf16x16Blocks[7]) >> 2; + + + cbMeanOf32x32Blocks[2] = (cbMeanOf16x16Blocks[8] + cbMeanOf16x16Blocks[9] + cbMeanOf16x16Blocks[12] + cbMeanOf16x16Blocks[13]) >> 2; + crMeanOf32x32Blocks[2] = (crMeanOf16x16Blocks[8] + crMeanOf16x16Blocks[9] + crMeanOf16x16Blocks[12] + crMeanOf16x16Blocks[13]) >> 2; + + cbMeanOf32x32Blocks[3] = (cbMeanOf16x16Blocks[10] + cbMeanOf16x16Blocks[11] + cbMeanOf16x16Blocks[14] + cbMeanOf16x16Blocks[15]) >> 2; + crMeanOf32x32Blocks[3] = (crMeanOf16x16Blocks[10] + crMeanOf16x16Blocks[11] + crMeanOf16x16Blocks[14] + crMeanOf16x16Blocks[15]) >> 2; + + // 64x64 + cbMeanOf64x64Blocks = (cbMeanOf32x32Blocks[0] + cbMeanOf32x32Blocks[1] + cbMeanOf32x32Blocks[3] + cbMeanOf32x32Blocks[3]) >> 2; + crMeanOf64x64Blocks = (crMeanOf32x32Blocks[0] + crMeanOf32x32Blocks[1] + crMeanOf32x32Blocks[3] + crMeanOf32x32Blocks[3]) >> 2; + // 16x16 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (cbMeanOf16x16Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (cbMeanOf16x16Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (cbMeanOf16x16Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (cbMeanOf16x16Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (cbMeanOf16x16Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (cbMeanOf16x16Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (cbMeanOf16x16Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (cbMeanOf16x16Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (cbMeanOf16x16Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (cbMeanOf16x16Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (cbMeanOf16x16Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (cbMeanOf16x16Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (cbMeanOf16x16Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (cbMeanOf16x16Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (cbMeanOf16x16Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (cbMeanOf16x16Blocks[15] >> MEAN_PRECISION); + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (crMeanOf16x16Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (crMeanOf16x16Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (crMeanOf16x16Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (crMeanOf16x16Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (crMeanOf16x16Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (crMeanOf16x16Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (crMeanOf16x16Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (crMeanOf16x16Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (crMeanOf16x16Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (crMeanOf16x16Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (crMeanOf16x16Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (crMeanOf16x16Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (crMeanOf16x16Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (crMeanOf16x16Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (crMeanOf16x16Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (crMeanOf16x16Blocks[15] >> MEAN_PRECISION); + + // 32x32 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8) (cbMeanOf32x32Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8) (cbMeanOf32x32Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8) (cbMeanOf32x32Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8) (cbMeanOf32x32Blocks[3] >> MEAN_PRECISION); + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(crMeanOf32x32Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(crMeanOf32x32Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(crMeanOf32x32Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(crMeanOf32x32Blocks[3] >> MEAN_PRECISION); + + // 64x64 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (cbMeanOf64x64Blocks >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (crMeanOf64x64Blocks >> MEAN_PRECISION); + + return return_error; } @@ -1671,15 +1671,15 @@ static EB_ERRORTYPE ComputeBlockMeanComputeVariance( EB_U64 meanOf64x64Blocks; EB_U64 meanOf64x64SquaredValuesBlocks; - if (pictureControlSetPtr->disableVarianceFlag) { - memset16bit(pictureControlSetPtr->variance[lcuIndex], 125, MAX_ME_PU_COUNT); - EB_MEMSET(pictureControlSetPtr->yMean[lcuIndex], 125, sizeof(EB_U8) * MAX_ME_PU_COUNT); + if (pictureControlSetPtr->disableVarianceFlag) { + memset16bit(pictureControlSetPtr->variance[lcuIndex], 125, MAX_ME_PU_COUNT); + EB_MEMSET(pictureControlSetPtr->yMean[lcuIndex], 125, sizeof(EB_U8) * MAX_ME_PU_COUNT); - } - else { + } + else { - // (0,0) - blockIndex = inputLumaOriginIndex; + // (0,0) + blockIndex = inputLumaOriginIndex; const EB_U16 strideY = inputPaddedPicturePtr->strideY; @@ -1787,7 +1787,7 @@ static EB_ERRORTYPE ComputeBlockMeanComputeVariance( ComputeIntermVarFour8x8_AVX2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY, &meanOf8x8Blocks[60], &meanOf8x8SquaredValuesBlocks[60]); - + } else{ meanOf8x8Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); @@ -2110,276 +2110,276 @@ static EB_ERRORTYPE ComputeBlockMeanComputeVariance( } - // 16x16 - meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; - meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; - meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; - meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - - meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; - meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; - meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; - meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; - - meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; - meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; - meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; - meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; - - meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; - meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; - meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; - meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; - - meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; - meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; - meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; - meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; - - meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; - meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; - meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; - meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; - - meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; - meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; - meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; - meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; - - meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; - meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; - meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; - meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; - - // 32x32 - meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; - meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; - meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; - meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; - - meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; - meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; - meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; - meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; - - // 64x64 - meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; - meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; - - // 8x8 means - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U8)(meanOf8x8Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U8)(meanOf8x8Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U8)(meanOf8x8Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U8)(meanOf8x8Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U8)(meanOf8x8Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U8)(meanOf8x8Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U8)(meanOf8x8Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U8)(meanOf8x8Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U8)(meanOf8x8Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U8)(meanOf8x8Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U8)(meanOf8x8Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U8)(meanOf8x8Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U8)(meanOf8x8Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U8)(meanOf8x8Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U8)(meanOf8x8Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U8)(meanOf8x8Blocks[15] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U8)(meanOf8x8Blocks[16] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U8)(meanOf8x8Blocks[17] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U8)(meanOf8x8Blocks[18] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U8)(meanOf8x8Blocks[19] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U8)(meanOf8x8Blocks[20] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U8)(meanOf8x8Blocks[21] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U8)(meanOf8x8Blocks[22] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U8)(meanOf8x8Blocks[23] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U8)(meanOf8x8Blocks[24] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U8)(meanOf8x8Blocks[25] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U8)(meanOf8x8Blocks[26] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U8)(meanOf8x8Blocks[27] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U8)(meanOf8x8Blocks[28] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U8)(meanOf8x8Blocks[29] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U8)(meanOf8x8Blocks[30] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U8)(meanOf8x8Blocks[31] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U8)(meanOf8x8Blocks[32] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U8)(meanOf8x8Blocks[33] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U8)(meanOf8x8Blocks[34] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U8)(meanOf8x8Blocks[35] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U8)(meanOf8x8Blocks[36] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U8)(meanOf8x8Blocks[37] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U8)(meanOf8x8Blocks[38] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U8)(meanOf8x8Blocks[39] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U8)(meanOf8x8Blocks[40] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U8)(meanOf8x8Blocks[41] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U8)(meanOf8x8Blocks[42] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U8)(meanOf8x8Blocks[43] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U8)(meanOf8x8Blocks[44] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U8)(meanOf8x8Blocks[45] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U8)(meanOf8x8Blocks[46] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U8)(meanOf8x8Blocks[47] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U8)(meanOf8x8Blocks[48] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U8)(meanOf8x8Blocks[49] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U8)(meanOf8x8Blocks[50] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U8)(meanOf8x8Blocks[51] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U8)(meanOf8x8Blocks[52] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U8)(meanOf8x8Blocks[53] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U8)(meanOf8x8Blocks[54] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U8)(meanOf8x8Blocks[55] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U8)(meanOf8x8Blocks[56] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U8)(meanOf8x8Blocks[57] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U8)(meanOf8x8Blocks[58] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U8)(meanOf8x8Blocks[59] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U8)(meanOf8x8Blocks[60] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U8)(meanOf8x8Blocks[61] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U8)(meanOf8x8Blocks[62] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U8)(meanOf8x8Blocks[63] >> MEAN_PRECISION); - - // 16x16 mean - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U8)(meanOf16x16Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U8)(meanOf16x16Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U8)(meanOf16x16Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U8)(meanOf16x16Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U8)(meanOf16x16Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U8)(meanOf16x16Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U8)(meanOf16x16Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U8)(meanOf16x16Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U8)(meanOf16x16Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U8)(meanOf16x16Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U8)(meanOf16x16Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U8)(meanOf16x16Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U8)(meanOf16x16Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U8)(meanOf16x16Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U8)(meanOf16x16Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U8)(meanOf16x16Blocks[15] >> MEAN_PRECISION); - - // 32x32 mean - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(meanOf32x32Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(meanOf32x32Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(meanOf32x32Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(meanOf32x32Blocks[3] >> MEAN_PRECISION); - - // 64x64 mean - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U8)(meanOf64x64Blocks >> MEAN_PRECISION); - - // 8x8 variances - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U16)((meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U16)((meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U16)((meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U16)((meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U16)((meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U16)((meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U16)((meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U16)((meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U16)((meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U16)((meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U16)((meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U16)((meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U16)((meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U16)((meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U16)((meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U16)((meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U16)((meanOf8x8SquaredValuesBlocks[16] - (meanOf8x8Blocks[16] * meanOf8x8Blocks[16])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U16)((meanOf8x8SquaredValuesBlocks[17] - (meanOf8x8Blocks[17] * meanOf8x8Blocks[17])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U16)((meanOf8x8SquaredValuesBlocks[18] - (meanOf8x8Blocks[18] * meanOf8x8Blocks[18])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U16)((meanOf8x8SquaredValuesBlocks[19] - (meanOf8x8Blocks[19] * meanOf8x8Blocks[19])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U16)((meanOf8x8SquaredValuesBlocks[20] - (meanOf8x8Blocks[20] * meanOf8x8Blocks[20])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U16)((meanOf8x8SquaredValuesBlocks[21] - (meanOf8x8Blocks[21] * meanOf8x8Blocks[21])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U16)((meanOf8x8SquaredValuesBlocks[22] - (meanOf8x8Blocks[22] * meanOf8x8Blocks[22])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U16)((meanOf8x8SquaredValuesBlocks[23] - (meanOf8x8Blocks[23] * meanOf8x8Blocks[23])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U16)((meanOf8x8SquaredValuesBlocks[24] - (meanOf8x8Blocks[24] * meanOf8x8Blocks[24])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U16)((meanOf8x8SquaredValuesBlocks[25] - (meanOf8x8Blocks[25] * meanOf8x8Blocks[25])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U16)((meanOf8x8SquaredValuesBlocks[26] - (meanOf8x8Blocks[26] * meanOf8x8Blocks[26])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U16)((meanOf8x8SquaredValuesBlocks[27] - (meanOf8x8Blocks[27] * meanOf8x8Blocks[27])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U16)((meanOf8x8SquaredValuesBlocks[28] - (meanOf8x8Blocks[28] * meanOf8x8Blocks[28])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U16)((meanOf8x8SquaredValuesBlocks[29] - (meanOf8x8Blocks[29] * meanOf8x8Blocks[29])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U16)((meanOf8x8SquaredValuesBlocks[30] - (meanOf8x8Blocks[30] * meanOf8x8Blocks[30])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U16)((meanOf8x8SquaredValuesBlocks[31] - (meanOf8x8Blocks[31] * meanOf8x8Blocks[31])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U16)((meanOf8x8SquaredValuesBlocks[32] - (meanOf8x8Blocks[32] * meanOf8x8Blocks[32])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U16)((meanOf8x8SquaredValuesBlocks[33] - (meanOf8x8Blocks[33] * meanOf8x8Blocks[33])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U16)((meanOf8x8SquaredValuesBlocks[34] - (meanOf8x8Blocks[34] * meanOf8x8Blocks[34])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U16)((meanOf8x8SquaredValuesBlocks[35] - (meanOf8x8Blocks[35] * meanOf8x8Blocks[35])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U16)((meanOf8x8SquaredValuesBlocks[36] - (meanOf8x8Blocks[36] * meanOf8x8Blocks[36])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U16)((meanOf8x8SquaredValuesBlocks[37] - (meanOf8x8Blocks[37] * meanOf8x8Blocks[37])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U16)((meanOf8x8SquaredValuesBlocks[38] - (meanOf8x8Blocks[38] * meanOf8x8Blocks[38])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U16)((meanOf8x8SquaredValuesBlocks[39] - (meanOf8x8Blocks[39] * meanOf8x8Blocks[39])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U16)((meanOf8x8SquaredValuesBlocks[40] - (meanOf8x8Blocks[40] * meanOf8x8Blocks[40])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U16)((meanOf8x8SquaredValuesBlocks[41] - (meanOf8x8Blocks[41] * meanOf8x8Blocks[41])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U16)((meanOf8x8SquaredValuesBlocks[42] - (meanOf8x8Blocks[42] * meanOf8x8Blocks[42])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U16)((meanOf8x8SquaredValuesBlocks[43] - (meanOf8x8Blocks[43] * meanOf8x8Blocks[43])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U16)((meanOf8x8SquaredValuesBlocks[44] - (meanOf8x8Blocks[44] * meanOf8x8Blocks[44])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U16)((meanOf8x8SquaredValuesBlocks[45] - (meanOf8x8Blocks[45] * meanOf8x8Blocks[45])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U16)((meanOf8x8SquaredValuesBlocks[46] - (meanOf8x8Blocks[46] * meanOf8x8Blocks[46])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U16)((meanOf8x8SquaredValuesBlocks[47] - (meanOf8x8Blocks[47] * meanOf8x8Blocks[47])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U16)((meanOf8x8SquaredValuesBlocks[48] - (meanOf8x8Blocks[48] * meanOf8x8Blocks[48])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U16)((meanOf8x8SquaredValuesBlocks[49] - (meanOf8x8Blocks[49] * meanOf8x8Blocks[49])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U16)((meanOf8x8SquaredValuesBlocks[50] - (meanOf8x8Blocks[50] * meanOf8x8Blocks[50])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U16)((meanOf8x8SquaredValuesBlocks[51] - (meanOf8x8Blocks[51] * meanOf8x8Blocks[51])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U16)((meanOf8x8SquaredValuesBlocks[52] - (meanOf8x8Blocks[52] * meanOf8x8Blocks[52])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U16)((meanOf8x8SquaredValuesBlocks[53] - (meanOf8x8Blocks[53] * meanOf8x8Blocks[53])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U16)((meanOf8x8SquaredValuesBlocks[54] - (meanOf8x8Blocks[54] * meanOf8x8Blocks[54])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U16)((meanOf8x8SquaredValuesBlocks[55] - (meanOf8x8Blocks[55] * meanOf8x8Blocks[55])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U16)((meanOf8x8SquaredValuesBlocks[56] - (meanOf8x8Blocks[56] * meanOf8x8Blocks[56])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U16)((meanOf8x8SquaredValuesBlocks[57] - (meanOf8x8Blocks[57] * meanOf8x8Blocks[57])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U16)((meanOf8x8SquaredValuesBlocks[58] - (meanOf8x8Blocks[58] * meanOf8x8Blocks[58])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U16)((meanOf8x8SquaredValuesBlocks[59] - (meanOf8x8Blocks[59] * meanOf8x8Blocks[59])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U16)((meanOf8x8SquaredValuesBlocks[60] - (meanOf8x8Blocks[60] * meanOf8x8Blocks[60])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U16)((meanOf8x8SquaredValuesBlocks[61] - (meanOf8x8Blocks[61] * meanOf8x8Blocks[61])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U16)((meanOf8x8SquaredValuesBlocks[62] - (meanOf8x8Blocks[62] * meanOf8x8Blocks[62])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U16)((meanOf8x8SquaredValuesBlocks[63] - (meanOf8x8Blocks[63] * meanOf8x8Blocks[63])) >> VARIANCE_PRECISION); - - // 16x16 variances - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U16)((meanOf16x16SquaredValuesBlocks[0] - (meanOf16x16Blocks[0] * meanOf16x16Blocks[0])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U16)((meanOf16x16SquaredValuesBlocks[1] - (meanOf16x16Blocks[1] * meanOf16x16Blocks[1])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U16)((meanOf16x16SquaredValuesBlocks[2] - (meanOf16x16Blocks[2] * meanOf16x16Blocks[2])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U16)((meanOf16x16SquaredValuesBlocks[3] - (meanOf16x16Blocks[3] * meanOf16x16Blocks[3])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U16)((meanOf16x16SquaredValuesBlocks[4] - (meanOf16x16Blocks[4] * meanOf16x16Blocks[4])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U16)((meanOf16x16SquaredValuesBlocks[5] - (meanOf16x16Blocks[5] * meanOf16x16Blocks[5])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U16)((meanOf16x16SquaredValuesBlocks[6] - (meanOf16x16Blocks[6] * meanOf16x16Blocks[6])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U16)((meanOf16x16SquaredValuesBlocks[7] - (meanOf16x16Blocks[7] * meanOf16x16Blocks[7])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U16)((meanOf16x16SquaredValuesBlocks[8] - (meanOf16x16Blocks[8] * meanOf16x16Blocks[8])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U16)((meanOf16x16SquaredValuesBlocks[9] - (meanOf16x16Blocks[9] * meanOf16x16Blocks[9])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U16)((meanOf16x16SquaredValuesBlocks[10] - (meanOf16x16Blocks[10] * meanOf16x16Blocks[10])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U16)((meanOf16x16SquaredValuesBlocks[11] - (meanOf16x16Blocks[11] * meanOf16x16Blocks[11])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U16)((meanOf16x16SquaredValuesBlocks[12] - (meanOf16x16Blocks[12] * meanOf16x16Blocks[12])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U16)((meanOf16x16SquaredValuesBlocks[13] - (meanOf16x16Blocks[13] * meanOf16x16Blocks[13])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U16)((meanOf16x16SquaredValuesBlocks[14] - (meanOf16x16Blocks[14] * meanOf16x16Blocks[14])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U16)((meanOf16x16SquaredValuesBlocks[15] - (meanOf16x16Blocks[15] * meanOf16x16Blocks[15])) >> VARIANCE_PRECISION); - - // 32x32 variances - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U16)((meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U16)((meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U16)((meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U16)((meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3])) >> VARIANCE_PRECISION); - - // 64x64 variance - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U16)((meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)) >> VARIANCE_PRECISION); + // 16x16 + meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; + meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; + meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; + meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; + + meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; + meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; + meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; + meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; + + meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; + meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; + meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; + meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; + + meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; + meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; + meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; + meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; + + meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; + meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; + meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; + meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; + + meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; + meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; + meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; + meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; + + meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; + meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; + meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; + meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; + + meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; + meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; + meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; + meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; + + // 32x32 + meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; + meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; + meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; + meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; + + meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; + meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; + meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; + meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; + + // 64x64 + meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; + meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; + + // 8x8 means + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U8)(meanOf8x8Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U8)(meanOf8x8Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U8)(meanOf8x8Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U8)(meanOf8x8Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U8)(meanOf8x8Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U8)(meanOf8x8Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U8)(meanOf8x8Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U8)(meanOf8x8Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U8)(meanOf8x8Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U8)(meanOf8x8Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U8)(meanOf8x8Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U8)(meanOf8x8Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U8)(meanOf8x8Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U8)(meanOf8x8Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U8)(meanOf8x8Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U8)(meanOf8x8Blocks[15] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U8)(meanOf8x8Blocks[16] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U8)(meanOf8x8Blocks[17] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U8)(meanOf8x8Blocks[18] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U8)(meanOf8x8Blocks[19] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U8)(meanOf8x8Blocks[20] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U8)(meanOf8x8Blocks[21] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U8)(meanOf8x8Blocks[22] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U8)(meanOf8x8Blocks[23] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U8)(meanOf8x8Blocks[24] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U8)(meanOf8x8Blocks[25] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U8)(meanOf8x8Blocks[26] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U8)(meanOf8x8Blocks[27] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U8)(meanOf8x8Blocks[28] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U8)(meanOf8x8Blocks[29] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U8)(meanOf8x8Blocks[30] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U8)(meanOf8x8Blocks[31] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U8)(meanOf8x8Blocks[32] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U8)(meanOf8x8Blocks[33] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U8)(meanOf8x8Blocks[34] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U8)(meanOf8x8Blocks[35] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U8)(meanOf8x8Blocks[36] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U8)(meanOf8x8Blocks[37] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U8)(meanOf8x8Blocks[38] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U8)(meanOf8x8Blocks[39] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U8)(meanOf8x8Blocks[40] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U8)(meanOf8x8Blocks[41] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U8)(meanOf8x8Blocks[42] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U8)(meanOf8x8Blocks[43] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U8)(meanOf8x8Blocks[44] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U8)(meanOf8x8Blocks[45] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U8)(meanOf8x8Blocks[46] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U8)(meanOf8x8Blocks[47] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U8)(meanOf8x8Blocks[48] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U8)(meanOf8x8Blocks[49] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U8)(meanOf8x8Blocks[50] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U8)(meanOf8x8Blocks[51] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U8)(meanOf8x8Blocks[52] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U8)(meanOf8x8Blocks[53] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U8)(meanOf8x8Blocks[54] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U8)(meanOf8x8Blocks[55] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U8)(meanOf8x8Blocks[56] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U8)(meanOf8x8Blocks[57] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U8)(meanOf8x8Blocks[58] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U8)(meanOf8x8Blocks[59] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U8)(meanOf8x8Blocks[60] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U8)(meanOf8x8Blocks[61] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U8)(meanOf8x8Blocks[62] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U8)(meanOf8x8Blocks[63] >> MEAN_PRECISION); + + // 16x16 mean + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U8)(meanOf16x16Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U8)(meanOf16x16Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U8)(meanOf16x16Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U8)(meanOf16x16Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U8)(meanOf16x16Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U8)(meanOf16x16Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U8)(meanOf16x16Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U8)(meanOf16x16Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U8)(meanOf16x16Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U8)(meanOf16x16Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U8)(meanOf16x16Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U8)(meanOf16x16Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U8)(meanOf16x16Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U8)(meanOf16x16Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U8)(meanOf16x16Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U8)(meanOf16x16Blocks[15] >> MEAN_PRECISION); + + // 32x32 mean + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(meanOf32x32Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(meanOf32x32Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(meanOf32x32Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(meanOf32x32Blocks[3] >> MEAN_PRECISION); + + // 64x64 mean + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U8)(meanOf64x64Blocks >> MEAN_PRECISION); + + // 8x8 variances + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U16)((meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U16)((meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U16)((meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U16)((meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U16)((meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U16)((meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U16)((meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U16)((meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U16)((meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U16)((meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U16)((meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U16)((meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U16)((meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U16)((meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U16)((meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U16)((meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U16)((meanOf8x8SquaredValuesBlocks[16] - (meanOf8x8Blocks[16] * meanOf8x8Blocks[16])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U16)((meanOf8x8SquaredValuesBlocks[17] - (meanOf8x8Blocks[17] * meanOf8x8Blocks[17])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U16)((meanOf8x8SquaredValuesBlocks[18] - (meanOf8x8Blocks[18] * meanOf8x8Blocks[18])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U16)((meanOf8x8SquaredValuesBlocks[19] - (meanOf8x8Blocks[19] * meanOf8x8Blocks[19])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U16)((meanOf8x8SquaredValuesBlocks[20] - (meanOf8x8Blocks[20] * meanOf8x8Blocks[20])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U16)((meanOf8x8SquaredValuesBlocks[21] - (meanOf8x8Blocks[21] * meanOf8x8Blocks[21])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U16)((meanOf8x8SquaredValuesBlocks[22] - (meanOf8x8Blocks[22] * meanOf8x8Blocks[22])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U16)((meanOf8x8SquaredValuesBlocks[23] - (meanOf8x8Blocks[23] * meanOf8x8Blocks[23])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U16)((meanOf8x8SquaredValuesBlocks[24] - (meanOf8x8Blocks[24] * meanOf8x8Blocks[24])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U16)((meanOf8x8SquaredValuesBlocks[25] - (meanOf8x8Blocks[25] * meanOf8x8Blocks[25])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U16)((meanOf8x8SquaredValuesBlocks[26] - (meanOf8x8Blocks[26] * meanOf8x8Blocks[26])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U16)((meanOf8x8SquaredValuesBlocks[27] - (meanOf8x8Blocks[27] * meanOf8x8Blocks[27])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U16)((meanOf8x8SquaredValuesBlocks[28] - (meanOf8x8Blocks[28] * meanOf8x8Blocks[28])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U16)((meanOf8x8SquaredValuesBlocks[29] - (meanOf8x8Blocks[29] * meanOf8x8Blocks[29])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U16)((meanOf8x8SquaredValuesBlocks[30] - (meanOf8x8Blocks[30] * meanOf8x8Blocks[30])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U16)((meanOf8x8SquaredValuesBlocks[31] - (meanOf8x8Blocks[31] * meanOf8x8Blocks[31])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U16)((meanOf8x8SquaredValuesBlocks[32] - (meanOf8x8Blocks[32] * meanOf8x8Blocks[32])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U16)((meanOf8x8SquaredValuesBlocks[33] - (meanOf8x8Blocks[33] * meanOf8x8Blocks[33])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U16)((meanOf8x8SquaredValuesBlocks[34] - (meanOf8x8Blocks[34] * meanOf8x8Blocks[34])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U16)((meanOf8x8SquaredValuesBlocks[35] - (meanOf8x8Blocks[35] * meanOf8x8Blocks[35])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U16)((meanOf8x8SquaredValuesBlocks[36] - (meanOf8x8Blocks[36] * meanOf8x8Blocks[36])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U16)((meanOf8x8SquaredValuesBlocks[37] - (meanOf8x8Blocks[37] * meanOf8x8Blocks[37])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U16)((meanOf8x8SquaredValuesBlocks[38] - (meanOf8x8Blocks[38] * meanOf8x8Blocks[38])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U16)((meanOf8x8SquaredValuesBlocks[39] - (meanOf8x8Blocks[39] * meanOf8x8Blocks[39])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U16)((meanOf8x8SquaredValuesBlocks[40] - (meanOf8x8Blocks[40] * meanOf8x8Blocks[40])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U16)((meanOf8x8SquaredValuesBlocks[41] - (meanOf8x8Blocks[41] * meanOf8x8Blocks[41])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U16)((meanOf8x8SquaredValuesBlocks[42] - (meanOf8x8Blocks[42] * meanOf8x8Blocks[42])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U16)((meanOf8x8SquaredValuesBlocks[43] - (meanOf8x8Blocks[43] * meanOf8x8Blocks[43])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U16)((meanOf8x8SquaredValuesBlocks[44] - (meanOf8x8Blocks[44] * meanOf8x8Blocks[44])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U16)((meanOf8x8SquaredValuesBlocks[45] - (meanOf8x8Blocks[45] * meanOf8x8Blocks[45])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U16)((meanOf8x8SquaredValuesBlocks[46] - (meanOf8x8Blocks[46] * meanOf8x8Blocks[46])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U16)((meanOf8x8SquaredValuesBlocks[47] - (meanOf8x8Blocks[47] * meanOf8x8Blocks[47])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U16)((meanOf8x8SquaredValuesBlocks[48] - (meanOf8x8Blocks[48] * meanOf8x8Blocks[48])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U16)((meanOf8x8SquaredValuesBlocks[49] - (meanOf8x8Blocks[49] * meanOf8x8Blocks[49])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U16)((meanOf8x8SquaredValuesBlocks[50] - (meanOf8x8Blocks[50] * meanOf8x8Blocks[50])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U16)((meanOf8x8SquaredValuesBlocks[51] - (meanOf8x8Blocks[51] * meanOf8x8Blocks[51])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U16)((meanOf8x8SquaredValuesBlocks[52] - (meanOf8x8Blocks[52] * meanOf8x8Blocks[52])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U16)((meanOf8x8SquaredValuesBlocks[53] - (meanOf8x8Blocks[53] * meanOf8x8Blocks[53])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U16)((meanOf8x8SquaredValuesBlocks[54] - (meanOf8x8Blocks[54] * meanOf8x8Blocks[54])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U16)((meanOf8x8SquaredValuesBlocks[55] - (meanOf8x8Blocks[55] * meanOf8x8Blocks[55])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U16)((meanOf8x8SquaredValuesBlocks[56] - (meanOf8x8Blocks[56] * meanOf8x8Blocks[56])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U16)((meanOf8x8SquaredValuesBlocks[57] - (meanOf8x8Blocks[57] * meanOf8x8Blocks[57])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U16)((meanOf8x8SquaredValuesBlocks[58] - (meanOf8x8Blocks[58] * meanOf8x8Blocks[58])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U16)((meanOf8x8SquaredValuesBlocks[59] - (meanOf8x8Blocks[59] * meanOf8x8Blocks[59])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U16)((meanOf8x8SquaredValuesBlocks[60] - (meanOf8x8Blocks[60] * meanOf8x8Blocks[60])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U16)((meanOf8x8SquaredValuesBlocks[61] - (meanOf8x8Blocks[61] * meanOf8x8Blocks[61])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U16)((meanOf8x8SquaredValuesBlocks[62] - (meanOf8x8Blocks[62] * meanOf8x8Blocks[62])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U16)((meanOf8x8SquaredValuesBlocks[63] - (meanOf8x8Blocks[63] * meanOf8x8Blocks[63])) >> VARIANCE_PRECISION); + + // 16x16 variances + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U16)((meanOf16x16SquaredValuesBlocks[0] - (meanOf16x16Blocks[0] * meanOf16x16Blocks[0])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U16)((meanOf16x16SquaredValuesBlocks[1] - (meanOf16x16Blocks[1] * meanOf16x16Blocks[1])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U16)((meanOf16x16SquaredValuesBlocks[2] - (meanOf16x16Blocks[2] * meanOf16x16Blocks[2])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U16)((meanOf16x16SquaredValuesBlocks[3] - (meanOf16x16Blocks[3] * meanOf16x16Blocks[3])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U16)((meanOf16x16SquaredValuesBlocks[4] - (meanOf16x16Blocks[4] * meanOf16x16Blocks[4])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U16)((meanOf16x16SquaredValuesBlocks[5] - (meanOf16x16Blocks[5] * meanOf16x16Blocks[5])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U16)((meanOf16x16SquaredValuesBlocks[6] - (meanOf16x16Blocks[6] * meanOf16x16Blocks[6])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U16)((meanOf16x16SquaredValuesBlocks[7] - (meanOf16x16Blocks[7] * meanOf16x16Blocks[7])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U16)((meanOf16x16SquaredValuesBlocks[8] - (meanOf16x16Blocks[8] * meanOf16x16Blocks[8])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U16)((meanOf16x16SquaredValuesBlocks[9] - (meanOf16x16Blocks[9] * meanOf16x16Blocks[9])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U16)((meanOf16x16SquaredValuesBlocks[10] - (meanOf16x16Blocks[10] * meanOf16x16Blocks[10])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U16)((meanOf16x16SquaredValuesBlocks[11] - (meanOf16x16Blocks[11] * meanOf16x16Blocks[11])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U16)((meanOf16x16SquaredValuesBlocks[12] - (meanOf16x16Blocks[12] * meanOf16x16Blocks[12])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U16)((meanOf16x16SquaredValuesBlocks[13] - (meanOf16x16Blocks[13] * meanOf16x16Blocks[13])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U16)((meanOf16x16SquaredValuesBlocks[14] - (meanOf16x16Blocks[14] * meanOf16x16Blocks[14])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U16)((meanOf16x16SquaredValuesBlocks[15] - (meanOf16x16Blocks[15] * meanOf16x16Blocks[15])) >> VARIANCE_PRECISION); + + // 32x32 variances + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U16)((meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U16)((meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U16)((meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U16)((meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3])) >> VARIANCE_PRECISION); + + // 64x64 variance + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U16)((meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)) >> VARIANCE_PRECISION); } - return return_error; + return return_error; } static EB_ERRORTYPE DenoiseInputPicture( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 lcuIndex; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U16 verticalIdx; - EB_U32 colorFormat = inputPicturePtr->colorFormat; - EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; - EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - //use denoised input if the source is extremly noisy - if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ - - EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 lcuIndex; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U16 verticalIdx; + EB_U32 colorFormat = inputPicturePtr->colorFormat; + EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; + EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; + //use denoised input if the source is extremly noisy + if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ + + EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; EB_U32 inChromaOffSet = (inputPicturePtr->originX >> subWidthCMinus1) + (inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; EB_U32 denChromaOffSet = (denoisedPicturePtr->originX >> subWidthCMinus1) + (denoisedPicturePtr->originY >> subHeightCMinus1) * denoisedPicturePtr->strideCb; - //filter Luma + //filter Luma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2388,32 +2388,32 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - StrongLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaStrong( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY, - lcuOriginX); - } - - } - - //copy Luma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * inputPicturePtr->width); - } - - //copy chroma + if (lcuOriginX == 0) + StrongLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaStrong( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY, + lcuOriginX); + } + + } + + //copy Luma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * inputPicturePtr->width); + } + + //copy chroma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2421,52 +2421,52 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - StrongChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); + if (lcuOriginX == 0) + StrongChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractChromaStrong( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); - } + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractChromaStrong( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); + } - } + } - //copy chroma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { + //copy chroma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, - denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, + denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, - denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - } + EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, + denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + } - } - else if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1){ + } + else if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1){ - EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; EB_U32 inChromaOffSet = (inputPicturePtr->originX >> subWidthCMinus1) + (inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; EB_U32 denChromaOffSet = (denoisedPicturePtr->originX >> subWidthCMinus1) + (denoisedPicturePtr->originY >> subHeightCMinus1) * denoisedPicturePtr->strideCb; - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * inputPicturePtr->width); - } + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * inputPicturePtr->width); + } - //copy chroma + //copy chroma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2474,42 +2474,42 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); + if (lcuOriginX == 0) + WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractChromaWeak( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); - } + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractChromaWeak( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); + } - } + } - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, - denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, + denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, - denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - } + EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, + denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + } - } + } else if (contextPtr->picNoiseVarianceFloat >= 1.0 && sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - //Luma : use filtered only for flatNoise LCUs + //Luma : use filtered only for flatNoise LCUs for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2517,118 +2517,118 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); - EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); + EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); + EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); - EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ + if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ - for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { + for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * lcuWidth); + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * lcuWidth); - } - } - } - } + } + } + } + } - return return_error; + return return_error; } static EB_ERRORTYPE DetectInputPictureNoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuIndex; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 lcuIndex; - EB_U64 picNoiseVariance; + EB_U64 picNoiseVariance; - EB_U32 totLcuCount, noiseTh; + EB_U32 totLcuCount, noiseTh; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U32 inputLumaOriginIndex; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U32 inputLumaOriginIndex; - picNoiseVariance = 0; - totLcuCount = 0; + picNoiseVariance = 0; + totLcuCount = 0; - //Variance calc for noise picture + //Variance calc for noise picture for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - inputLumaOriginIndex = (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY + - noisePicturePtr->originX + lcuOriginX; - + inputLumaOriginIndex = (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY + + noisePicturePtr->originX + lcuOriginX; - EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - if (lcuOriginX == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); + EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaWeak( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - } + if (lcuOriginX == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaWeak( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + } - //do it only for complete 64x64 blocks - if (lcuParams->isCompleteLcu) - { + //do it only for complete 64x64 blocks + if (lcuParams->isCompleteLcu) + { - EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; + EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; - EB_U64 noiseBlkVar = ComputeVariance64x64( + EB_U64 noiseBlkVar = ComputeVariance64x64( noisePicturePtr, - noiseOriginIndex, - noiseBlkVar32x32); + noiseOriginIndex, + noiseBlkVar32x32); EB_U64 noiseBlkVarTh ; EB_U64 denBlkVarTh = FLAT_MAX_VAR; - if (pictureControlSetPtr->noiseDetectionTh == 1) - noiseBlkVarTh = NOISE_MIN_LEVEL_0; - else - noiseBlkVarTh = NOISE_MIN_LEVEL_1; + if (pictureControlSetPtr->noiseDetectionTh == 1) + noiseBlkVarTh = NOISE_MIN_LEVEL_0; + else + noiseBlkVarTh = NOISE_MIN_LEVEL_1; - picNoiseVariance += (noiseBlkVar >> 16); + picNoiseVariance += (noiseBlkVar >> 16); - EB_U64 denBlkVar = ComputeVariance64x64( + EB_U64 denBlkVar = ComputeVariance64x64( denoisedPicturePtr, - inputLumaOriginIndex, - denoiseBlkVar32x32) >> 16; + inputLumaOriginIndex, + denoiseBlkVar32x32) >> 16; - if (denBlkVar < denBlkVarTh && noiseBlkVar > noiseBlkVarTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; - } + if (denBlkVar < denBlkVarTh && noiseBlkVar > noiseBlkVarTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; + } - totLcuCount++; - } + totLcuCount++; + } - } + } if (totLcuCount > 0) { contextPtr->picNoiseVarianceFloat = (double)picNoiseVariance / (double)totLcuCount; @@ -2636,60 +2636,60 @@ static EB_ERRORTYPE DetectInputPictureNoise( picNoiseVariance = picNoiseVariance / totLcuCount; } - //the variance of a 64x64 noise area tends to be bigger for small resolutions. - if (sequenceControlSetPtr->lumaHeight <= 720) - noiseTh = 25; - else - noiseTh = 0; - - if (picNoiseVariance >= 80 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_10; - else if (picNoiseVariance >= 70 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_9; - else if (picNoiseVariance >= 60 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_8; - else if (picNoiseVariance >= 50 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_7; - else if (picNoiseVariance >= 40 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_6; - else if (picNoiseVariance >= 30 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_5; - else if (picNoiseVariance >= 20 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_4; - else if (picNoiseVariance >= 17 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; - else if (picNoiseVariance >= 10 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; - else if (picNoiseVariance >= 5 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; - else - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; - - if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; - - return return_error; + //the variance of a 64x64 noise area tends to be bigger for small resolutions. + if (sequenceControlSetPtr->lumaHeight <= 720) + noiseTh = 25; + else + noiseTh = 0; + + if (picNoiseVariance >= 80 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_10; + else if (picNoiseVariance >= 70 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_9; + else if (picNoiseVariance >= 60 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_8; + else if (picNoiseVariance >= 50 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_7; + else if (picNoiseVariance >= 40 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_6; + else if (picNoiseVariance >= 30 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_5; + else if (picNoiseVariance >= 20 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_4; + else if (picNoiseVariance >= 17 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; + else if (picNoiseVariance >= 10 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; + else if (picNoiseVariance >= 5 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; + else + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; + + if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; + + return return_error; } static EB_ERRORTYPE FullSampleDenoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuTotalCount, - EB_BOOL denoiseFlag) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuTotalCount, + EB_BOOL denoiseFlag) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuCodingOrder; - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; + EB_U32 lcuCodingOrder; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; - //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; + //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; } pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY @@ -2717,31 +2717,31 @@ static EB_ERRORTYPE FullSampleDenoise( } static EB_ERRORTYPE SubSampleFilterNoise( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuIndex; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U16 verticalIdx; + EB_U32 lcuIndex; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U16 verticalIdx; EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) { + if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) { - EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; EB_U32 inChromaOffSet = (inputPicturePtr->originX >> subWidthCMinus1) + (inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; EB_U32 denChromaOffSet = (denoisedPicturePtr->originX >> subWidthCMinus1) + (denoisedPicturePtr->originY >> subHeightCMinus1) * denoisedPicturePtr->strideCb; - //filter Luma + //filter Luma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2749,33 +2749,33 @@ static EB_ERRORTYPE SubSampleFilterNoise( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaWeak( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - } - } - - //copy luma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * inputPicturePtr->width); - } - - //filter chroma + if (lcuOriginX == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaWeak( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + } + } + + //copy luma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * inputPicturePtr->width); + } + + //filter chroma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2783,95 +2783,95 @@ static EB_ERRORTYPE SubSampleFilterNoise( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); + if (lcuOriginX == 0) + WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractChromaWeak( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); - } + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractChromaWeak( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); + } - } + } - //copy chroma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { + //copy chroma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, - denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, + denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, - denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - } + EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, + denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + } - } else if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2){ + } else if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2){ - EB_U32 newTotFN = 0; + EB_U32 newTotFN = 0; - //for each LCU ,re check the FN information for only the FNdecim ones + //for each LCU ,re check the FN information for only the FNdecim ones for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - EB_U32 inputLumaOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY; - EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY * noisePicturePtr->strideY); - - if (lcuParams->isCompleteLcu && pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1) - { - - WeakLumaFilterLcu_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaWeakLcu( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - } - - EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; - EB_U64 noiseBlkVar = ComputeVariance64x64( + EB_U32 inputLumaOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY; + EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY * noisePicturePtr->strideY); + + if (lcuParams->isCompleteLcu && pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1) + { + + WeakLumaFilterLcu_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaWeakLcu( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + } + + EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; + EB_U64 noiseBlkVar = ComputeVariance64x64( noisePicturePtr, noiseOriginIndex, noiseBlkVar32x32); - EB_U64 denBlkVar = ComputeVariance64x64( + EB_U64 denBlkVar = ComputeVariance64x64( denoisedPicturePtr, inputLumaOriginIndex, denoiseBlkVar32x32) >> 16; EB_U64 noiseBlkVarTh ; EB_U64 denBlkVarTh = FLAT_MAX_VAR; - if (pictureControlSetPtr->noiseDetectionTh == 1) - noiseBlkVarTh = NOISE_MIN_LEVEL_0; - else - noiseBlkVarTh = NOISE_MIN_LEVEL_1; + if (pictureControlSetPtr->noiseDetectionTh == 1) + noiseBlkVarTh = NOISE_MIN_LEVEL_0; + else + noiseBlkVarTh = NOISE_MIN_LEVEL_1; - if (denBlkVar noiseBlkVarTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; - //SVT_LOG("POC %i (%i,%i) denBlkVar: %i noiseBlkVar :%i\n", pictureControlSetPtr->pictureNumber,lcuOriginX,lcuOriginY, denBlkVar, noiseBlkVar); - newTotFN++; + if (denBlkVar noiseBlkVarTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; + //SVT_LOG("POC %i (%i,%i) denBlkVar: %i noiseBlkVar :%i\n", pictureControlSetPtr->pictureNumber,lcuOriginX,lcuOriginY, denBlkVar, noiseBlkVar); + newTotFN++; - } - else{ - pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 0; - } - } - } + } + else{ + pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 0; + } + } + } //filter Luma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { @@ -2881,126 +2881,126 @@ static EB_ERRORTYPE SubSampleFilterNoise( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX + 64 <= inputPicturePtr->width && lcuOriginY + 64 <= inputPicturePtr->height) - { + if (lcuOriginX + 64 <= inputPicturePtr->width && lcuOriginY + 64 <= inputPicturePtr->height) + { - //use the denoised for FN LCUs - if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ + //use the denoised for FN LCUs + if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ - EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); - EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); + EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); + EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); - EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { + for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * lcuWidth); + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * lcuWidth); - } - } + } + } - } + } - } + } - } - return return_error; + } + return return_error; } static EB_ERRORTYPE QuarterSampleDetectNoise( - PictureAnalysisContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U64 picNoiseVariance; + EB_U64 picNoiseVariance; - EB_U32 totLcuCount, noiseTh; + EB_U32 totLcuCount, noiseTh; - EB_U32 blockIndex; + EB_U32 blockIndex; - picNoiseVariance = 0; - totLcuCount = 0; + picNoiseVariance = 0; + totLcuCount = 0; - EB_U16 vert64x64Index; - EB_U16 horz64x64Index; - EB_U32 block64x64X; - EB_U32 block64x64Y; - EB_U32 vert32x32Index; - EB_U32 horz32x32Index; - EB_U32 block32x32X; - EB_U32 block32x32Y; - EB_U32 noiseOriginIndex; - EB_U32 lcuCodingOrder; + EB_U16 vert64x64Index; + EB_U16 horz64x64Index; + EB_U32 block64x64X; + EB_U32 block64x64Y; + EB_U32 vert32x32Index; + EB_U32 horz32x32Index; + EB_U32 block32x32X; + EB_U32 block32x32Y; + EB_U32 noiseOriginIndex; + EB_U32 lcuCodingOrder; - // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) - for (vert64x64Index = 0; vert64x64Index < (quarterDecimatedPicturePtr->height / 64); vert64x64Index++){ - for (horz64x64Index = 0; horz64x64Index < (quarterDecimatedPicturePtr->width / 64); horz64x64Index++){ + // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) + for (vert64x64Index = 0; vert64x64Index < (quarterDecimatedPicturePtr->height / 64); vert64x64Index++){ + for (horz64x64Index = 0; horz64x64Index < (quarterDecimatedPicturePtr->width / 64); horz64x64Index++){ - block64x64X = horz64x64Index * 64; - block64x64Y = vert64x64Index * 64; + block64x64X = horz64x64Index * 64; + block64x64Y = vert64x64Index * 64; - if (block64x64X == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - quarterDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); + if (block64x64X == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + quarterDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); - if (block64x64Y + MAX_LCU_SIZE > quarterDecimatedPicturePtr->width) - { - noiseExtractLumaWeak( - quarterDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); - } + if (block64x64Y + MAX_LCU_SIZE > quarterDecimatedPicturePtr->width) + { + noiseExtractLumaWeak( + quarterDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); + } - // Loop over 32x32 blocks (i.e, 64x64 blocks in full resolution) - for (vert32x32Index = 0; vert32x32Index < 2; vert32x32Index++){ - for (horz32x32Index = 0; horz32x32Index < 2; horz32x32Index++){ + // Loop over 32x32 blocks (i.e, 64x64 blocks in full resolution) + for (vert32x32Index = 0; vert32x32Index < 2; vert32x32Index++){ + for (horz32x32Index = 0; horz32x32Index < 2; horz32x32Index++){ - block32x32X = block64x64X + horz32x32Index * 32; - block32x32Y = block64x64Y + vert32x32Index * 32; + block32x32X = block64x64X + horz32x32Index * 32; + block32x32Y = block64x64Y + vert32x32Index * 32; - //do it only for complete 32x32 blocks (i.e, complete 64x64 blocks in full resolution) - if ((block32x32X + 32 <= quarterDecimatedPicturePtr->width) && (block32x32Y + 32 <= quarterDecimatedPicturePtr->height)) - { + //do it only for complete 32x32 blocks (i.e, complete 64x64 blocks in full resolution) + if ((block32x32X + 32 <= quarterDecimatedPicturePtr->width) && (block32x32Y + 32 <= quarterDecimatedPicturePtr->height)) + { - lcuCodingOrder = ((vert64x64Index * 2) + vert32x32Index) * pictureWidthInLcu + ((horz64x64Index * 2) + horz32x32Index); + lcuCodingOrder = ((vert64x64Index * 2) + vert32x32Index) * pictureWidthInLcu + ((horz64x64Index * 2) + horz32x32Index); - EB_U64 noiseBlkVar8x8[16], denoiseBlkVar8x8[16]; + EB_U64 noiseBlkVar8x8[16], denoiseBlkVar8x8[16]; - noiseOriginIndex = noisePicturePtr->originX + block32x32X + noisePicturePtr->originY * noisePicturePtr->strideY; + noiseOriginIndex = noisePicturePtr->originX + block32x32X + noisePicturePtr->originY * noisePicturePtr->strideY; - EB_U64 noiseBlkVar = ComputeVariance32x32( - noisePicturePtr, - noiseOriginIndex, - noiseBlkVar8x8); + EB_U64 noiseBlkVar = ComputeVariance32x32( + noisePicturePtr, + noiseOriginIndex, + noiseBlkVar8x8); - picNoiseVariance += (noiseBlkVar >> 16); + picNoiseVariance += (noiseBlkVar >> 16); - blockIndex = (noisePicturePtr->originY + block32x32Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block32x32X; + blockIndex = (noisePicturePtr->originY + block32x32Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block32x32X; - EB_U64 denBlkVar = ComputeVariance32x32( - denoisedPicturePtr, - blockIndex, - denoiseBlkVar8x8) >> 16; + EB_U64 denBlkVar = ComputeVariance32x32( + denoisedPicturePtr, + blockIndex, + denoiseBlkVar8x8) >> 16; EB_U64 denBlkVarDecTh; @@ -3011,16 +3011,16 @@ static EB_ERRORTYPE QuarterSampleDetectNoise( denBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_0; } - if (denBlkVar < FLAT_MAX_VAR_DECIM && noiseBlkVar> denBlkVarDecTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; - } + if (denBlkVar < FLAT_MAX_VAR_DECIM && noiseBlkVar> denBlkVarDecTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; + } - totLcuCount++; - } - } - } - } - } + totLcuCount++; + } + } + } + } + } if (totLcuCount > 0) { contextPtr->picNoiseVarianceFloat = (double)picNoiseVariance / (double)totLcuCount; @@ -3028,143 +3028,143 @@ static EB_ERRORTYPE QuarterSampleDetectNoise( picNoiseVariance = picNoiseVariance / totLcuCount; } - //the variance of a 64x64 noise area tends to be bigger for small resolutions. - //if (sequenceControlSetPtr->lumaHeight <= 720) - // noiseTh = 25; - //else if (sequenceControlSetPtr->lumaHeight <= 1080) - // noiseTh = 10; - //else - noiseTh = 0; + //the variance of a 64x64 noise area tends to be bigger for small resolutions. + //if (sequenceControlSetPtr->lumaHeight <= 720) + // noiseTh = 25; + //else if (sequenceControlSetPtr->lumaHeight <= 1080) + // noiseTh = 10; + //else + noiseTh = 0; + + //look for extreme noise or big enough flat noisy area to be denoised. + if (picNoiseVariance > 60) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) + else if (picNoiseVariance >= 10 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) + else if (picNoiseVariance >= 5 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) + else + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) - //look for extreme noise or big enough flat noisy area to be denoised. - if (picNoiseVariance > 60) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) - else if (picNoiseVariance >= 10 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) - else if (picNoiseVariance >= 5 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) - else - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) - - return return_error; + return return_error; } static EB_ERRORTYPE SubSampleDetectNoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U64 picNoiseVariance; + EB_U64 picNoiseVariance; - EB_U32 totLcuCount, noiseTh; + EB_U32 totLcuCount, noiseTh; - EB_U32 blockIndex; + EB_U32 blockIndex; - picNoiseVariance = 0; - totLcuCount = 0; + picNoiseVariance = 0; + totLcuCount = 0; - EB_U16 vert64x64Index; - EB_U16 horz64x64Index; - EB_U32 block64x64X; - EB_U32 block64x64Y; - EB_U32 vert16x16Index; - EB_U32 horz16x16Index; - EB_U32 block16x16X; - EB_U32 block16x16Y; - EB_U32 noiseOriginIndex; - EB_U32 lcuCodingOrder; + EB_U16 vert64x64Index; + EB_U16 horz64x64Index; + EB_U32 block64x64X; + EB_U32 block64x64Y; + EB_U32 vert16x16Index; + EB_U32 horz16x16Index; + EB_U32 block16x16X; + EB_U32 block16x16Y; + EB_U32 noiseOriginIndex; + EB_U32 lcuCodingOrder; - // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) - for (vert64x64Index = 0; vert64x64Index < (sixteenthDecimatedPicturePtr->height / 64); vert64x64Index++){ - for (horz64x64Index = 0; horz64x64Index < (sixteenthDecimatedPicturePtr->width / 64); horz64x64Index++){ + // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) + for (vert64x64Index = 0; vert64x64Index < (sixteenthDecimatedPicturePtr->height / 64); vert64x64Index++){ + for (horz64x64Index = 0; horz64x64Index < (sixteenthDecimatedPicturePtr->width / 64); horz64x64Index++){ - block64x64X = horz64x64Index * 64; - block64x64Y = vert64x64Index * 64; + block64x64X = horz64x64Index * 64; + block64x64Y = vert64x64Index * 64; - if (block64x64X == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - sixteenthDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); + if (block64x64X == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + sixteenthDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); - if (block64x64Y + MAX_LCU_SIZE > sixteenthDecimatedPicturePtr->width) - { - noiseExtractLumaWeak( - sixteenthDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); - } + if (block64x64Y + MAX_LCU_SIZE > sixteenthDecimatedPicturePtr->width) + { + noiseExtractLumaWeak( + sixteenthDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); + } - // Loop over 16x16 blocks (i.e, 64x64 blocks in full resolution) - for (vert16x16Index = 0; vert16x16Index < 4; vert16x16Index++){ - for (horz16x16Index = 0; horz16x16Index < 4; horz16x16Index++){ + // Loop over 16x16 blocks (i.e, 64x64 blocks in full resolution) + for (vert16x16Index = 0; vert16x16Index < 4; vert16x16Index++){ + for (horz16x16Index = 0; horz16x16Index < 4; horz16x16Index++){ - block16x16X = block64x64X + horz16x16Index * 16; - block16x16Y = block64x64Y + vert16x16Index * 16; + block16x16X = block64x64X + horz16x16Index * 16; + block16x16Y = block64x64Y + vert16x16Index * 16; - //do it only for complete 16x16 blocks (i.e, complete 64x64 blocks in full resolution) - if (block16x16X + 16 <= sixteenthDecimatedPicturePtr->width && block16x16Y + 16 <= sixteenthDecimatedPicturePtr->height) - { + //do it only for complete 16x16 blocks (i.e, complete 64x64 blocks in full resolution) + if (block16x16X + 16 <= sixteenthDecimatedPicturePtr->width && block16x16Y + 16 <= sixteenthDecimatedPicturePtr->height) + { - lcuCodingOrder = ((vert64x64Index * 4) + vert16x16Index) * pictureWidthInLcu + ((horz64x64Index * 4) + horz16x16Index); + lcuCodingOrder = ((vert64x64Index * 4) + vert16x16Index) * pictureWidthInLcu + ((horz64x64Index * 4) + horz16x16Index); - EB_U64 noiseBlkVar8x8[4], denoiseBlkVar8x8[4]; + EB_U64 noiseBlkVar8x8[4], denoiseBlkVar8x8[4]; - noiseOriginIndex = noisePicturePtr->originX + block16x16X + noisePicturePtr->originY * noisePicturePtr->strideY; + noiseOriginIndex = noisePicturePtr->originX + block16x16X + noisePicturePtr->originY * noisePicturePtr->strideY; - EB_U64 noiseBlkVar = ComputeVariance16x16( - noisePicturePtr, - noiseOriginIndex, - noiseBlkVar8x8); + EB_U64 noiseBlkVar = ComputeVariance16x16( + noisePicturePtr, + noiseOriginIndex, + noiseBlkVar8x8); - picNoiseVariance += (noiseBlkVar >> 16); + picNoiseVariance += (noiseBlkVar >> 16); - blockIndex = (noisePicturePtr->originY + block16x16Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block16x16X; + blockIndex = (noisePicturePtr->originY + block16x16Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block16x16X; - EB_U64 denBlkVar = ComputeVariance16x16( - denoisedPicturePtr, - blockIndex, - denoiseBlkVar8x8) >> 16; + EB_U64 denBlkVar = ComputeVariance16x16( + denoisedPicturePtr, + blockIndex, + denoiseBlkVar8x8) >> 16; EB_U64 noiseBlkVarDecTh ; EB_U64 denBlkVarDecTh = FLAT_MAX_VAR_DECIM; - if (pictureControlSetPtr->noiseDetectionTh == 1) { - noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_0; - } - else { - noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_1; - } - - if (denBlkVar < denBlkVarDecTh && noiseBlkVar> noiseBlkVarDecTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; - } - totLcuCount++; - } - } - } - } - } + if (pictureControlSetPtr->noiseDetectionTh == 1) { + noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_0; + } + else { + noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_1; + } + + if (denBlkVar < denBlkVarDecTh && noiseBlkVar> noiseBlkVarDecTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; + } + totLcuCount++; + } + } + } + } + } if (totLcuCount > 0) { contextPtr->picNoiseVarianceFloat = (double)picNoiseVariance / (double)totLcuCount; @@ -3172,51 +3172,51 @@ static EB_ERRORTYPE SubSampleDetectNoise( picNoiseVariance = picNoiseVariance / totLcuCount; } - //the variance of a 64x64 noise area tends to be bigger for small resolutions. - if (sequenceControlSetPtr->lumaHeight <= 720) - noiseTh = 25; - else if (sequenceControlSetPtr->lumaHeight <= 1080) - noiseTh = 10; - else - noiseTh = 0; - - //look for extreme noise or big enough flat noisy area to be denoised. - if (picNoiseVariance >= 55 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) - else if (picNoiseVariance >= 10 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) - else if (picNoiseVariance >= 5 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) - else - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) - - return return_error; + //the variance of a 64x64 noise area tends to be bigger for small resolutions. + if (sequenceControlSetPtr->lumaHeight <= 720) + noiseTh = 25; + else if (sequenceControlSetPtr->lumaHeight <= 1080) + noiseTh = 10; + else + noiseTh = 0; + + //look for extreme noise or big enough flat noisy area to be denoised. + if (picNoiseVariance >= 55 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) + else if (picNoiseVariance >= 10 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) + else if (picNoiseVariance >= 5 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) + else + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) + + return return_error; } static EB_ERRORTYPE QuarterSampleDenoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EB_U32 lcuTotalCount, - EB_BOOL denoiseFlag, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EB_U32 lcuTotalCount, + EB_BOOL denoiseFlag, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuCodingOrder; - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; + EB_U32 lcuCodingOrder; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; - //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; - } + //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; + } - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY Decimation2D( &inputPicturePtr->bufferY[inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY], @@ -3228,57 +3228,57 @@ static EB_ERRORTYPE QuarterSampleDenoise( 2); - QuarterSampleDetectNoise( - contextPtr, - pictureControlSetPtr, - quarterDecimatedPicturePtr, - noisePicturePtr, - denoisedPicturePtr, - pictureWidthInLcu); + QuarterSampleDetectNoise( + contextPtr, + pictureControlSetPtr, + quarterDecimatedPicturePtr, + noisePicturePtr, + denoisedPicturePtr, + pictureWidthInLcu); + + if (denoiseFlag == EB_TRUE) { - if (denoiseFlag == EB_TRUE) { - // Turn OFF the de-noiser for Class 2 at QP=29 and lower (for Fixed_QP) and at the target rate of 14Mbps and higher (for RC=ON) - if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { + if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { - SubSampleFilterNoise( - sequenceControlSetPtr, - pictureControlSetPtr, - inputPicturePtr, - noisePicturePtr, - denoisedPicturePtr); - } - } + SubSampleFilterNoise( + sequenceControlSetPtr, + pictureControlSetPtr, + inputPicturePtr, + noisePicturePtr, + denoisedPicturePtr); + } + } - return return_error; + return return_error; } static EB_ERRORTYPE HalfSampleDenoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 lcuTotalCount, - EB_BOOL denoiseFlag, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 lcuTotalCount, + EB_BOOL denoiseFlag, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 lcuCodingOrder; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; - EB_U32 lcuCodingOrder; - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; + //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; + } - //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; - } + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY - Decimation2D( &inputPicturePtr->bufferY[inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY], inputPicturePtr->strideY, @@ -3288,30 +3288,30 @@ static EB_ERRORTYPE HalfSampleDenoise( sixteenthDecimatedPicturePtr->strideY, 4); - SubSampleDetectNoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - sixteenthDecimatedPicturePtr, - noisePicturePtr, - denoisedPicturePtr, - pictureWidthInLcu); + SubSampleDetectNoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + sixteenthDecimatedPicturePtr, + noisePicturePtr, + denoisedPicturePtr, + pictureWidthInLcu); - if (denoiseFlag == EB_TRUE) { + if (denoiseFlag == EB_TRUE) { - // Turn OFF the de-noiser for Class 2 at QP=29 and lower (for Fixed_QP) and at the target rate of 14Mbps and higher (for RC=ON) - if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { + // Turn OFF the de-noiser for Class 2 at QP=29 and lower (for Fixed_QP) and at the target rate of 14Mbps and higher (for RC=ON) + if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { - SubSampleFilterNoise( - sequenceControlSetPtr, - pictureControlSetPtr, - inputPicturePtr, - noisePicturePtr, - denoisedPicturePtr); - } - } + SubSampleFilterNoise( + sequenceControlSetPtr, + pictureControlSetPtr, + inputPicturePtr, + noisePicturePtr, + denoisedPicturePtr); + } + } - return return_error; + return return_error; } @@ -3322,14 +3322,14 @@ static EB_ERRORTYPE HalfSampleDenoise( ** Setting width and height for subpicture and when picture scan type is 1 ************************************************/ static void SetPictureParametersForStatisticsGathering( - SequenceControlSet_t *sequenceControlSetPtr - ) + SequenceControlSet_t *sequenceControlSetPtr + ) { - sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_WIDTH; - sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_HEIGHT; - sequenceControlSetPtr->pictureActivityRegionTh = HIGHER_THAN_CLASS_1_PICTURE_ACTIVITY_REGIONS_TH; + sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_WIDTH; + sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_HEIGHT; + sequenceControlSetPtr->pictureActivityRegionTh = HIGHER_THAN_CLASS_1_PICTURE_ACTIVITY_REGIONS_TH; - return; + return; } /************************************************ @@ -3341,44 +3341,44 @@ static void SetPictureParametersForStatisticsGathering( ***** Denoising ************************************************/ static void PicturePreProcessingOperations( - PictureParentControlSet_t *pictureControlSetPtr, - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 lcuTotalCount, - EB_U32 pictureWidthInLcu) + PictureParentControlSet_t *pictureControlSetPtr, + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 lcuTotalCount, + EB_U32 pictureWidthInLcu) { - if (pictureControlSetPtr->noiseDetectionMethod == NOISE_DETECT_HALF_PRECISION) { - - HalfSampleDenoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - sixteenthDecimatedPicturePtr, - lcuTotalCount, - pictureControlSetPtr->enableDenoiseSrcFlag, - pictureWidthInLcu); - } + if (pictureControlSetPtr->noiseDetectionMethod == NOISE_DETECT_HALF_PRECISION) { + + HalfSampleDenoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + sixteenthDecimatedPicturePtr, + lcuTotalCount, + pictureControlSetPtr->enableDenoiseSrcFlag, + pictureWidthInLcu); + } else if (pictureControlSetPtr->noiseDetectionMethod == NOISE_DETECT_QUARTER_PRECISION) { - QuarterSampleDenoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - quarterDecimatedPicturePtr, - lcuTotalCount, - pictureControlSetPtr->enableDenoiseSrcFlag, - pictureWidthInLcu); - } else { - FullSampleDenoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - lcuTotalCount, - pictureControlSetPtr->enableDenoiseSrcFlag - ); - } - return; + QuarterSampleDenoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + quarterDecimatedPicturePtr, + lcuTotalCount, + pictureControlSetPtr->enableDenoiseSrcFlag, + pictureWidthInLcu); + } else { + FullSampleDenoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + lcuTotalCount, + pictureControlSetPtr->enableDenoiseSrcFlag + ); + } + return; } @@ -3387,59 +3387,59 @@ static void PicturePreProcessingOperations( * Calculation is done on a region based (Set previously, resolution dependent) **************************************************************/ static void SubSampleLumaGeneratePixelIntensityHistogramBins( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, EB_U64 *sumAverageIntensityTotalRegionsLuma){ - EB_U32 regionWidth; - EB_U32 regionHeight; - EB_U32 regionWidthOffset; - EB_U32 regionHeightOffset; - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; - EB_U32 histogramBin; - EB_U64 sum; + EB_U32 regionWidth; + EB_U32 regionHeight; + EB_U32 regionWidthOffset; + EB_U32 regionHeightOffset; + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; + EB_U32 histogramBin; + EB_U64 sum; - regionWidth = inputPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; - regionHeight = inputPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; + regionWidth = inputPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; + regionHeight = inputPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; - // Loop over regions inside the picture - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions + // Loop over regions inside the picture + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions - // Initialize bins to 1 - InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0], 64, 0, 1); + // Initialize bins to 1 + InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0], 64, 0, 1); - regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? - inputPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : - 0; + regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? + inputPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : + 0; - regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? - inputPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : - 0; + regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? + inputPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : + 0; - // Y Histogram - CalculateHistogram( - &inputPicturePtr->bufferY[(inputPicturePtr->originX + regionInPictureWidthIndex * regionWidth) + ((inputPicturePtr->originY + regionInPictureHeightIndex * regionHeight) * inputPicturePtr->strideY)], - regionWidth + regionWidthOffset, - regionHeight + regionHeightOffset, - inputPicturePtr->strideY, + // Y Histogram + CalculateHistogram( + &inputPicturePtr->bufferY[(inputPicturePtr->originX + regionInPictureWidthIndex * regionWidth) + ((inputPicturePtr->originY + regionInPictureHeightIndex * regionHeight) * inputPicturePtr->strideY)], + regionWidth + regionWidthOffset, + regionHeight + regionHeightOffset, + inputPicturePtr->strideY, 1, pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0], - &sum); + &sum); - pictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] = (EB_U8)((sum + (((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset)) >> 1)) / ((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset))); + pictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] = (EB_U8)((sum + (((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset)) >> 1)) / ((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset))); (*sumAverageIntensityTotalRegionsLuma) += (sum << 4); for (histogramBin = 0; histogramBin < HISTOGRAM_NUMBER_OF_BINS; histogramBin++){ // Loop over the histogram bins - pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] = - pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] << 4; - } - } - } + pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] = + pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] << 4; + } + } + } - return; + return; } static void SubSampleChromaGeneratePixelIntensityHistogramBins( @@ -3469,8 +3469,8 @@ static void SubSampleChromaGeneratePixelIntensityHistogramBins( // Initialize bins to 1 - InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1], 64, 0, 1); - InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2], 64, 0, 1); + InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1], 64, 0, 1); + InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2], 64, 0, 1); regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? inputPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : @@ -3525,140 +3525,140 @@ static void SubSampleChromaGeneratePixelIntensityHistogramBins( } static void EdgeDetectionMeanLumaChroma16x16( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, PictureAnalysisContext_t *contextPtr, - EB_U32 totalLcuCount) + EB_U32 totalLcuCount) { - EB_U32 lcuIndex; - - - EB_U32 maxGrad = 1; - - // The values are calculated for every 4th frame - if ((pictureControlSetPtr->pictureNumber & 3) == 0){ - for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { - - LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - - EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu) - - { - EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; - EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; - EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; - - EB_U8 rasterScanCuIndex; - - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { - EB_U8 cuIndex = rasterScanCuIndex - 5; - EB_U8 x = cuIndex & 3; - EB_U8 y = (cuIndex >> 2); - EB_S32 gradx = 0; - EB_S32 grady = 0; - EB_S32 nbcompx = 0; - EB_S32 nbcompy = 0; - if (x != 0) - { - gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 1])); - gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 1])); - gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 1])); - nbcompx++; - } - if (x != 3) - { - gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); - gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); - gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); - nbcompx++; - } - gradx = gradx / nbcompx; - - - if (y != 0) - { - grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 4])); - grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 4])); - grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 4])); - nbcompy++; - } - if (y != 3) - { - grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); - grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); - grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); - - nbcompy++; - } - - grady = grady / nbcompy; - + EB_U32 lcuIndex; + + + EB_U32 maxGrad = 1; + + // The values are calculated for every 4th frame + if ((pictureControlSetPtr->pictureNumber & 3) == 0){ + for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { + + LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; + + EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu) + + { + EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; + EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; + EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; + + EB_U8 rasterScanCuIndex; + + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { + EB_U8 cuIndex = rasterScanCuIndex - 5; + EB_U8 x = cuIndex & 3; + EB_U8 y = (cuIndex >> 2); + EB_S32 gradx = 0; + EB_S32 grady = 0; + EB_S32 nbcompx = 0; + EB_S32 nbcompy = 0; + if (x != 0) + { + gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 1])); + gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 1])); + gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 1])); + nbcompx++; + } + if (x != 3) + { + gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); + gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); + gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); + nbcompx++; + } + gradx = gradx / nbcompx; + + + if (y != 0) + { + grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 4])); + grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 4])); + grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 4])); + nbcompy++; + } + if (y != 3) + { + grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); + grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); + grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); + + nbcompy++; + } + + grady = grady / nbcompy; + contextPtr->grad[lcuIndex][rasterScanCuIndex] = (EB_U16) (ABS(gradx) + ABS(grady)); - if (contextPtr->grad[lcuIndex][rasterScanCuIndex] > maxGrad){ - maxGrad = contextPtr->grad[lcuIndex][rasterScanCuIndex]; - } - } - } - } - - for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu){ - LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - - EB_U32 rasterScanCuIndex; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { - lcuStatPtr->cuStatArray[rasterScanCuIndex].edgeCu = (EB_U16)MIN(((contextPtr->grad[lcuIndex][rasterScanCuIndex] * (255*3)) / maxGrad), 255) < 30 ? 0 : 1; - } - } - } - } - else{ - for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { - - LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - - EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); - } - } + if (contextPtr->grad[lcuIndex][rasterScanCuIndex] > maxGrad){ + maxGrad = contextPtr->grad[lcuIndex][rasterScanCuIndex]; + } + } + } + } + + for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu){ + LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; + + EB_U32 rasterScanCuIndex; + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { + lcuStatPtr->cuStatArray[rasterScanCuIndex].edgeCu = (EB_U16)MIN(((contextPtr->grad[lcuIndex][rasterScanCuIndex] * (255*3)) / maxGrad), 255) < 30 ? 0 : 1; + } + } + } + } + else{ + for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { + + LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; + + EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); + } + } } /****************************************************** * Edge map derivation ******************************************************/ static void EdgeDetection( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U16 *variancePtr; - EB_U64 thrsldLevel0 = (pictureControlSetPtr->picAvgVariance * 70) / 100; - EB_U8 *meanPtr; - EB_U32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - EB_U32 pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - EB_U32 neighbourLcuIndex = 0; - EB_U64 similarityCount = 0; - EB_U64 similarityCount0 = 0; - EB_U64 similarityCount1 = 0; - EB_U64 similarityCount2 = 0; - EB_U64 similarityCount3 = 0; - EB_U32 lcu_X = 0; - EB_U32 lcu_Y = 0; - EB_U32 lcuIndex; - EB_BOOL highVarianceLucFlag; - - EB_U32 rasterScanCuIndex = 0; - EB_U32 numberOfEdgeLcu = 0; - EB_BOOL highIntensityLcuFlag; - - EB_U64 neighbourLcuMean; - EB_S32 i, j; - - EB_U8 highIntensityTh = 180; - EB_U8 lowIntensityTh = 120; + EB_U16 *variancePtr; + EB_U64 thrsldLevel0 = (pictureControlSetPtr->picAvgVariance * 70) / 100; + EB_U8 *meanPtr; + EB_U32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + EB_U32 pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + EB_U32 neighbourLcuIndex = 0; + EB_U64 similarityCount = 0; + EB_U64 similarityCount0 = 0; + EB_U64 similarityCount1 = 0; + EB_U64 similarityCount2 = 0; + EB_U64 similarityCount3 = 0; + EB_U32 lcu_X = 0; + EB_U32 lcu_Y = 0; + EB_U32 lcuIndex; + EB_BOOL highVarianceLucFlag; + + EB_U32 rasterScanCuIndex = 0; + EB_U32 numberOfEdgeLcu = 0; + EB_BOOL highIntensityLcuFlag; + + EB_U64 neighbourLcuMean; + EB_S32 i, j; + + EB_U8 highIntensityTh = 180; + EB_U8 lowIntensityTh = 120; EB_U8 highIntensityTh1 = 200; EB_U8 veryLowIntensityTh = 20; @@ -3671,25 +3671,25 @@ static void EdgeDetection( EdgeLcuResults_t *edgeResultsPtr = pictureControlSetPtr->edgeResultsPtr; pictureControlSetPtr->edgeResultsPtr[lcuIndex].edgeBlockNum = 0; - pictureControlSetPtr->edgeResultsPtr[lcuIndex].isolatedHighIntensityLcu = 0; + pictureControlSetPtr->edgeResultsPtr[lcuIndex].isolatedHighIntensityLcu = 0; pictureControlSetPtr->sharpEdgeLcuFlag[lcuIndex] = 0; - if (lcu_X > 0 && lcu_X < (EB_U32)(pictureWidthInLcu - 1) && lcu_Y > 0 && lcu_Y < (EB_U32)(pictureHeightInLcu - 1)){ + if (lcu_X > 0 && lcu_X < (EB_U32)(pictureWidthInLcu - 1) && lcu_Y > 0 && lcu_Y < (EB_U32)(pictureHeightInLcu - 1)){ - variancePtr = pictureControlSetPtr->variance[lcuIndex]; - meanPtr = pictureControlSetPtr->yMean[lcuIndex]; + variancePtr = pictureControlSetPtr->variance[lcuIndex]; + meanPtr = pictureControlSetPtr->yMean[lcuIndex]; - similarityCount = 0; + similarityCount = 0; - highVarianceLucFlag = - (variancePtr[RASTER_SCAN_CU_INDEX_64x64] > thrsldLevel0) ? EB_TRUE : EB_FALSE; + highVarianceLucFlag = + (variancePtr[RASTER_SCAN_CU_INDEX_64x64] > thrsldLevel0) ? EB_TRUE : EB_FALSE; edgeResultsPtr[lcuIndex].edgeBlockNum = highVarianceLucFlag; if (variancePtr[0] > highIntensityTh1){ EB_U8 sharpEdge = 0; for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { sharpEdge = (variancePtr[rasterScanCuIndex] < veryLowIntensityTh) ? sharpEdge + 1 : sharpEdge; - + } if (sharpEdge > 4) { @@ -3698,56 +3698,56 @@ static void EdgeDetection( } - if (lcu_X > 3 && lcu_X < (EB_U32)(pictureWidthInLcu - 4) && lcu_Y > 3 && lcu_Y < (EB_U32)(pictureHeightInLcu - 4)){ + if (lcu_X > 3 && lcu_X < (EB_U32)(pictureWidthInLcu - 4) && lcu_Y > 3 && lcu_Y < (EB_U32)(pictureHeightInLcu - 4)){ - highIntensityLcuFlag = - (meanPtr[RASTER_SCAN_CU_INDEX_64x64] > highIntensityTh) ? EB_TRUE : EB_FALSE; + highIntensityLcuFlag = + (meanPtr[RASTER_SCAN_CU_INDEX_64x64] > highIntensityTh) ? EB_TRUE : EB_FALSE; - if (highIntensityLcuFlag){ + if (highIntensityLcuFlag){ - neighbourLcuIndex = lcuIndex - 1; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + neighbourLcuIndex = lcuIndex - 1; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount0 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + similarityCount0 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - neighbourLcuIndex = lcuIndex + 1; + neighbourLcuIndex = lcuIndex + 1; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount1 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + similarityCount1 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - neighbourLcuIndex = lcuIndex - pictureWidthInLcu; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount2 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + neighbourLcuIndex = lcuIndex - pictureWidthInLcu; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + similarityCount2 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - neighbourLcuIndex = lcuIndex + pictureWidthInLcu; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount3 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + neighbourLcuIndex = lcuIndex + pictureWidthInLcu; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + similarityCount3 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - similarityCount = similarityCount0 + similarityCount1 + similarityCount2 + similarityCount3; - - if (similarityCount > 0){ + similarityCount = similarityCount0 + similarityCount1 + similarityCount2 + similarityCount3; + if (similarityCount > 0){ - for (i = -4; i < 5; i++){ - for (j = -4; j < 5; j++){ - neighbourLcuIndex = lcuIndex + (i * pictureWidthInLcu) + j; + + for (i = -4; i < 5; i++){ + for (j = -4; j < 5; j++){ + neighbourLcuIndex = lcuIndex + (i * pictureWidthInLcu) + j; pictureControlSetPtr->edgeResultsPtr[neighbourLcuIndex].isolatedHighIntensityLcu = 1; - } - } - } - } - } + } + } + } + } + } - if (highVarianceLucFlag){ + if (highVarianceLucFlag){ numberOfEdgeLcu += edgeResultsPtr[lcuIndex].edgeBlockNum; - } - } - } + } + } + } - pictureControlSetPtr->lcuBlockPercentage = (EB_U8)((numberOfEdgeLcu * 100) / pictureControlSetPtr->lcuTotalCount); + pictureControlSetPtr->lcuBlockPercentage = (EB_U8)((numberOfEdgeLcu * 100) / pictureControlSetPtr->lcuTotalCount); - return; + return; } /****************************************************** @@ -3783,7 +3783,7 @@ static inline void DetermineHomogeneousRegionInPicture( if (lcuParams->isCompleteLcu){ nullVarCnt += (variancePtr[ME_TIER_ZERO_PU_64x64] == 0) ? 1 : 0; - + varLcuCnt++; veryLowVarCnt += ((variancePtr[ME_TIER_ZERO_PU_64x64]) < LCU_LOW_VAR_TH) ? 1 : 0; @@ -3882,60 +3882,60 @@ static inline void DetermineHomogeneousRegionInPicture( ** Compute Block Mean for all blocks in the picture ************************************************/ static void ComputePictureSpatialStatistics( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, PictureAnalysisContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *inputPaddedPicturePtr, - EB_U32 lcuTotalCount) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *inputPaddedPicturePtr, + EB_U32 lcuTotalCount) { - EB_U32 lcuIndex; - EB_U32 lcuOriginX; // to avoid using child PCS - EB_U32 lcuOriginY; - EB_U32 inputLumaOriginIndex; - EB_U32 inputCbOriginIndex; - EB_U32 inputCrOriginIndex; - EB_U64 picTotVariance; - - // Variance - picTotVariance = 0; - - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + EB_U32 lcuIndex; + EB_U32 lcuOriginX; // to avoid using child PCS + EB_U32 lcuOriginY; + EB_U32 inputLumaOriginIndex; + EB_U32 inputCbOriginIndex; + EB_U32 inputCrOriginIndex; + EB_U64 picTotVariance; + + // Variance + picTotVariance = 0; + + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - lcuOriginX = lcuParams->originX; - lcuOriginY = lcuParams->originY; - inputLumaOriginIndex = (inputPaddedPicturePtr->originY + lcuOriginY) * inputPaddedPicturePtr->strideY + - inputPaddedPicturePtr->originX + lcuOriginX; + lcuOriginX = lcuParams->originX; + lcuOriginY = lcuParams->originY; + inputLumaOriginIndex = (inputPaddedPicturePtr->originY + lcuOriginY) * inputPaddedPicturePtr->strideY + + inputPaddedPicturePtr->originX + lcuOriginX; - inputCbOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCb + ((inputPicturePtr->originX + lcuOriginX) >> 1); - inputCrOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCr + ((inputPicturePtr->originX + lcuOriginX) >> 1); + inputCbOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCb + ((inputPicturePtr->originX + lcuOriginX) >> 1); + inputCrOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCr + ((inputPicturePtr->originX + lcuOriginX) >> 1); - ComputeBlockMeanComputeVariance( - pictureControlSetPtr, - inputPaddedPicturePtr, - lcuIndex, - inputLumaOriginIndex); + ComputeBlockMeanComputeVariance( + pictureControlSetPtr, + inputPaddedPicturePtr, + lcuIndex, + inputLumaOriginIndex); if (lcuParams->isCompleteLcu){ - ComputeChromaBlockMean( - pictureControlSetPtr, - inputPicturePtr, - lcuIndex, - inputCbOriginIndex, - inputCrOriginIndex); - } - else{ - ZeroOutChromaBlockMean( - pictureControlSetPtr, - lcuIndex); - } - - picTotVariance += (pictureControlSetPtr->variance[lcuIndex][RASTER_SCAN_CU_INDEX_64x64]); - } - - pictureControlSetPtr->picAvgVariance = (EB_U16) (picTotVariance / lcuTotalCount); + ComputeChromaBlockMean( + pictureControlSetPtr, + inputPicturePtr, + lcuIndex, + inputCbOriginIndex, + inputCrOriginIndex); + } + else{ + ZeroOutChromaBlockMean( + pictureControlSetPtr, + lcuIndex); + } + + picTotVariance += (pictureControlSetPtr->variance[lcuIndex][RASTER_SCAN_CU_INDEX_64x64]); + } + + pictureControlSetPtr->picAvgVariance = (EB_U16) (picTotVariance / lcuTotalCount); // Calculate the variance of variance to determine Homogeneous regions. Note: Variance calculation should be on. DetermineHomogeneousRegionInPicture( sequenceControlSetPtr, @@ -3947,21 +3947,21 @@ static void ComputePictureSpatialStatistics( contextPtr, sequenceControlSetPtr->lcuTotalCount); - EdgeDetection( - sequenceControlSetPtr, - pictureControlSetPtr); + EdgeDetection( + sequenceControlSetPtr, + pictureControlSetPtr); - return; + return; } static void CalculateInputAverageIntensity( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EB_U64 sumAverageIntensityTotalRegionsLuma, - EB_U64 sumAverageIntensityTotalRegionsCb, - EB_U64 sumAverageIntensityTotalRegionsCr) + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EB_U64 sumAverageIntensityTotalRegionsLuma, + EB_U64 sumAverageIntensityTotalRegionsCb, + EB_U64 sumAverageIntensityTotalRegionsCr) { if (sequenceControlSetPtr->scdMode == SCD_MODE_0){ @@ -3988,7 +3988,7 @@ static void CalculateInputAverageIntensity( pictureControlSetPtr->averageIntensity[1] = (EB_U8)((sumAverageIntensityTotalRegionsCb + ((inputPicturePtr->width*inputPicturePtr->height) >> 3)) / ((inputPicturePtr->width*inputPicturePtr->height) >> 2)); pictureControlSetPtr->averageIntensity[2] = (EB_U8)((sumAverageIntensityTotalRegionsCr + ((inputPicturePtr->width*inputPicturePtr->height) >> 3)) / ((inputPicturePtr->width*inputPicturePtr->height) >> 2)); } - + return; } @@ -3998,22 +3998,22 @@ static void CalculateInputAverageIntensity( ** Computing Picture Variance ************************************************/ static void GatheringPictureStatistics( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, PictureAnalysisContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *inputPaddedPicturePtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 lcuTotalCount) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *inputPaddedPicturePtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 lcuTotalCount) { - EB_U64 sumAverageIntensityTotalRegionsLuma = 0; - EB_U64 sumAverageIntensityTotalRegionsCb = 0; - EB_U64 sumAverageIntensityTotalRegionsCr = 0; + EB_U64 sumAverageIntensityTotalRegionsLuma = 0; + EB_U64 sumAverageIntensityTotalRegionsCb = 0; + EB_U64 sumAverageIntensityTotalRegionsCr = 0; - // Histogram bins + // Histogram bins // Use 1/16 Luma for Histogram generation - // 1/16 input ready + // 1/16 input ready SubSampleLumaGeneratePixelIntensityHistogramBins( sequenceControlSetPtr, pictureControlSetPtr, @@ -4021,15 +4021,15 @@ static void GatheringPictureStatistics( &sumAverageIntensityTotalRegionsLuma); // Use 1/4 Chroma for Histogram generation - // 1/4 input not ready => perform operation on the fly + // 1/4 input not ready => perform operation on the fly SubSampleChromaGeneratePixelIntensityHistogramBins( sequenceControlSetPtr, pictureControlSetPtr, inputPicturePtr, &sumAverageIntensityTotalRegionsCb, &sumAverageIntensityTotalRegionsCr); - - // Calculate the LUMA average intensity + + // Calculate the LUMA average intensity CalculateInputAverageIntensity( sequenceControlSetPtr, pictureControlSetPtr, @@ -4038,15 +4038,15 @@ static void GatheringPictureStatistics( sumAverageIntensityTotalRegionsCb, sumAverageIntensityTotalRegionsCr); - ComputePictureSpatialStatistics( - sequenceControlSetPtr, - pictureControlSetPtr, + ComputePictureSpatialStatistics( + sequenceControlSetPtr, + pictureControlSetPtr, contextPtr, - inputPicturePtr, - inputPaddedPicturePtr, - lcuTotalCount); + inputPicturePtr, + inputPaddedPicturePtr, + lcuTotalCount); - return; + return; } /************************************************ @@ -4054,34 +4054,34 @@ static void GatheringPictureStatistics( ** To match a multiple of min CU size in width and height ************************************************/ static void PadPictureToMultipleOfMinCuSizeDimensions( - SequenceControlSet_t *sequenceControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr) + SequenceControlSet_t *sequenceControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr) { EB_BOOL is16BitInput = (EB_BOOL)(sequenceControlSetPtr->staticConfig.encoderBitDepth > EB_8BIT); EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - // Input Picture Padding - PadInputPicture( - &inputPicturePtr->bufferY[inputPicturePtr->originX + (inputPicturePtr->originY * inputPicturePtr->strideY)], - inputPicturePtr->strideY, - (inputPicturePtr->width - sequenceControlSetPtr->padRight), - (inputPicturePtr->height - sequenceControlSetPtr->padBottom), - sequenceControlSetPtr->padRight, - sequenceControlSetPtr->padBottom); - - PadInputPicture( - &inputPicturePtr->bufferCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb)], - inputPicturePtr->strideCb, + // Input Picture Padding + PadInputPicture( + &inputPicturePtr->bufferY[inputPicturePtr->originX + (inputPicturePtr->originY * inputPicturePtr->strideY)], + inputPicturePtr->strideY, + (inputPicturePtr->width - sequenceControlSetPtr->padRight), + (inputPicturePtr->height - sequenceControlSetPtr->padBottom), + sequenceControlSetPtr->padRight, + sequenceControlSetPtr->padBottom); + + PadInputPicture( + &inputPicturePtr->bufferCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb)], + inputPicturePtr->strideCb, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, sequenceControlSetPtr->padRight >> subWidthCMinus1, sequenceControlSetPtr->padBottom >> subHeightCMinus1); - PadInputPicture( - &inputPicturePtr->bufferCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCr)], - inputPicturePtr->strideCr, + PadInputPicture( + &inputPicturePtr->bufferCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCr)], + inputPicturePtr->strideCr, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, sequenceControlSetPtr->padRight >> subWidthCMinus1, @@ -4097,7 +4097,7 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( sequenceControlSetPtr->padBottom); PadInputPicture( - &inputPicturePtr->bufferBitIncCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCb)], + &inputPicturePtr->bufferBitIncCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCb)], inputPicturePtr->strideBitIncCb, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, @@ -4105,7 +4105,7 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( sequenceControlSetPtr->padBottom >> subHeightCMinus1); PadInputPicture( - &inputPicturePtr->bufferBitIncCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCr)], + &inputPicturePtr->bufferBitIncCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCr)], inputPicturePtr->strideBitIncCr, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, @@ -4114,7 +4114,7 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( } - return; + return; } /************************************************ @@ -4122,20 +4122,20 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( ** To complete border LCU smaller than LCU size ************************************************/ static void PadPictureToMultipleOfLcuDimensions( - EbPictureBufferDesc_t *inputPaddedPicturePtr + EbPictureBufferDesc_t *inputPaddedPicturePtr ) { - // Generate Padding - GeneratePadding( - &inputPaddedPicturePtr->bufferY[0], - inputPaddedPicturePtr->strideY, - inputPaddedPicturePtr->width, - inputPaddedPicturePtr->height, - inputPaddedPicturePtr->originX, - inputPaddedPicturePtr->originY); + // Generate Padding + GeneratePadding( + &inputPaddedPicturePtr->bufferY[0], + inputPaddedPicturePtr->strideY, + inputPaddedPicturePtr->width, + inputPaddedPicturePtr->height, + inputPaddedPicturePtr->originX, + inputPaddedPicturePtr->originY); - return; + return; } /************************************************ @@ -4143,14 +4143,14 @@ static void PadPictureToMultipleOfLcuDimensions( ************************************************/ static void DecimateInputPicture( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPaddedPicturePtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr) { + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPaddedPicturePtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr) { // Decimate input picture for HME L1 EB_BOOL preformQuarterPellDecimationFlag; - if (sequenceControlSetPtr->staticConfig.speedControlFlag){ + if (sequenceControlSetPtr->staticConfig.speedControlFlag){ preformQuarterPellDecimationFlag = EB_TRUE; } else{ @@ -4164,42 +4164,42 @@ static void DecimateInputPicture( if (preformQuarterPellDecimationFlag) { Decimation2D( - &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], - inputPaddedPicturePtr->strideY, - inputPaddedPicturePtr->width , - inputPaddedPicturePtr->height, - &quarterDecimatedPicturePtr->bufferY[quarterDecimatedPicturePtr->originX+quarterDecimatedPicturePtr->originY*quarterDecimatedPicturePtr->strideY], - quarterDecimatedPicturePtr->strideY, - 2); + &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], + inputPaddedPicturePtr->strideY, + inputPaddedPicturePtr->width , + inputPaddedPicturePtr->height, + &quarterDecimatedPicturePtr->bufferY[quarterDecimatedPicturePtr->originX+quarterDecimatedPicturePtr->originY*quarterDecimatedPicturePtr->strideY], + quarterDecimatedPicturePtr->strideY, + 2); GeneratePadding( - &quarterDecimatedPicturePtr->bufferY[0], - quarterDecimatedPicturePtr->strideY, - quarterDecimatedPicturePtr->width, - quarterDecimatedPicturePtr->height, - quarterDecimatedPicturePtr->originX, - quarterDecimatedPicturePtr->originY); + &quarterDecimatedPicturePtr->bufferY[0], + quarterDecimatedPicturePtr->strideY, + quarterDecimatedPicturePtr->width, + quarterDecimatedPicturePtr->height, + quarterDecimatedPicturePtr->originX, + quarterDecimatedPicturePtr->originY); - } + } // Decimate input picture for HME L0 - // Sixteenth Input Picture Decimation + // Sixteenth Input Picture Decimation Decimation2D( - &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], - inputPaddedPicturePtr->strideY, - inputPaddedPicturePtr->width , - inputPaddedPicturePtr->height , - &sixteenthDecimatedPicturePtr->bufferY[sixteenthDecimatedPicturePtr->originX+sixteenthDecimatedPicturePtr->originY*sixteenthDecimatedPicturePtr->strideY], - sixteenthDecimatedPicturePtr->strideY, - 4); + &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], + inputPaddedPicturePtr->strideY, + inputPaddedPicturePtr->width , + inputPaddedPicturePtr->height , + &sixteenthDecimatedPicturePtr->bufferY[sixteenthDecimatedPicturePtr->originX+sixteenthDecimatedPicturePtr->originY*sixteenthDecimatedPicturePtr->strideY], + sixteenthDecimatedPicturePtr->strideY, + 4); GeneratePadding( - &sixteenthDecimatedPicturePtr->bufferY[0], - sixteenthDecimatedPicturePtr->strideY, - sixteenthDecimatedPicturePtr->width, - sixteenthDecimatedPicturePtr->height, - sixteenthDecimatedPicturePtr->originX, - sixteenthDecimatedPicturePtr->originY); + &sixteenthDecimatedPicturePtr->bufferY[0], + sixteenthDecimatedPicturePtr->strideY, + sixteenthDecimatedPicturePtr->width, + sixteenthDecimatedPicturePtr->height, + sixteenthDecimatedPicturePtr->originX, + sixteenthDecimatedPicturePtr->originY); } /************************************************ @@ -4213,61 +4213,61 @@ static void DecimateInputPicture( ************************************************/ void* PictureAnalysisKernel(void *inputPtr) { - PictureAnalysisContext_t *contextPtr = (PictureAnalysisContext_t*)inputPtr; - PictureParentControlSet_t *pictureControlSetPtr; - SequenceControlSet_t *sequenceControlSetPtr; - - EbObjectWrapper_t *inputResultsWrapperPtr; - ResourceCoordinationResults_t *inputResultsPtr; - EbObjectWrapper_t *outputResultsWrapperPtr; - PictureAnalysisResults_t *outputResultsPtr; - EbPaReferenceObject_t *paReferenceObject; - - EbPictureBufferDesc_t *inputPaddedPicturePtr; - EbPictureBufferDesc_t *quarterDecimatedPicturePtr; - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; - EbPictureBufferDesc_t *inputPicturePtr; - - // Variance - EB_U32 pictureWidthInLcu; - EB_U32 pictureHeighInLcu; - EB_U32 lcuTotalCount; - - for (;;) { - - // Get Input Full Object - EbGetFullObject( - contextPtr->resourceCoordinationResultsInputFifoPtr, - &inputResultsWrapperPtr); + PictureAnalysisContext_t *contextPtr = (PictureAnalysisContext_t*)inputPtr; + PictureParentControlSet_t *pictureControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; + + EbObjectWrapper_t *inputResultsWrapperPtr; + ResourceCoordinationResults_t *inputResultsPtr; + EbObjectWrapper_t *outputResultsWrapperPtr; + PictureAnalysisResults_t *outputResultsPtr; + EbPaReferenceObject_t *paReferenceObject; + + EbPictureBufferDesc_t *inputPaddedPicturePtr; + EbPictureBufferDesc_t *quarterDecimatedPicturePtr; + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr; + + // Variance + EB_U32 pictureWidthInLcu; + EB_U32 pictureHeighInLcu; + EB_U32 lcuTotalCount; + + for (;;) { + + // Get Input Full Object + EbGetFullObject( + contextPtr->resourceCoordinationResultsInputFifoPtr, + &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (ResourceCoordinationResults_t*)inputResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + inputResultsPtr = (ResourceCoordinationResults_t*)inputResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld PA IN \n", pictureControlSetPtr->pictureNumber); #endif - paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; - inputPaddedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->inputPaddedPicturePtr; - quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; - sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; + paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; + inputPaddedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->inputPaddedPicturePtr; + quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; + sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; - // Variance - pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - pictureHeighInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - lcuTotalCount = pictureWidthInLcu * pictureHeighInLcu; + // Variance + pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureHeighInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + lcuTotalCount = pictureWidthInLcu * pictureHeighInLcu; // Set picture parameters to account for subpicture, picture scantype, and set regions by resolutions - SetPictureParametersForStatisticsGathering( - sequenceControlSetPtr); + SetPictureParametersForStatisticsGathering( + sequenceControlSetPtr); - // Pad pictures to multiple min cu size - PadPictureToMultipleOfMinCuSizeDimensions( - sequenceControlSetPtr, - inputPicturePtr); + // Pad pictures to multiple min cu size + PadPictureToMultipleOfMinCuSizeDimensions( + sequenceControlSetPtr, + inputPicturePtr); - // Pre processing operations performed on the input picture + // Pre processing operations performed on the input picture PicturePreProcessingOperations( pictureControlSetPtr, contextPtr, @@ -4276,7 +4276,7 @@ void* PictureAnalysisKernel(void *inputPtr) sixteenthDecimatedPicturePtr, lcuTotalCount, pictureWidthInLcu); - + if (inputPicturePtr->colorFormat >= EB_YUV422) { // Jing: Do the conversion of 422/444=>420 here since it's multi-threaded kernel // Reuse the Y, only add cb/cr in the newly created buffer desc @@ -4287,52 +4287,52 @@ void* PictureAnalysisKernel(void *inputPtr) pictureControlSetPtr->chromaDownSamplePicturePtr = inputPicturePtr; } - // Pad input picture to complete border LCUs - PadPictureToMultipleOfLcuDimensions( - inputPaddedPicturePtr + // Pad input picture to complete border LCUs + PadPictureToMultipleOfLcuDimensions( + inputPaddedPicturePtr ); - - // 1/4 & 1/16 input picture decimation - DecimateInputPicture( + + // 1/4 & 1/16 input picture decimation + DecimateInputPicture( sequenceControlSetPtr, - pictureControlSetPtr, - inputPaddedPicturePtr, - quarterDecimatedPicturePtr, - sixteenthDecimatedPicturePtr); - - // Gathering statistics of input picture, including Variance Calculation, Histogram Bins - GatheringPictureStatistics( - sequenceControlSetPtr, - pictureControlSetPtr, + pictureControlSetPtr, + inputPaddedPicturePtr, + quarterDecimatedPicturePtr, + sixteenthDecimatedPicturePtr); + + // Gathering statistics of input picture, including Variance Calculation, Histogram Bins + GatheringPictureStatistics( + sequenceControlSetPtr, + pictureControlSetPtr, contextPtr, - pictureControlSetPtr->chromaDownSamplePicturePtr, //420 inputPicturePtr - inputPaddedPicturePtr, - sixteenthDecimatedPicturePtr, - lcuTotalCount); + pictureControlSetPtr->chromaDownSamplePicturePtr, //420 inputPicturePtr + inputPaddedPicturePtr, + sixteenthDecimatedPicturePtr, + lcuTotalCount); - // Hold the 64x64 variance and mean in the reference frame - EB_U32 lcuIndex; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex){ - paReferenceObject->variance[lcuIndex] = pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64]; - paReferenceObject->yMean[lcuIndex] = pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64]; + // Hold the 64x64 variance and mean in the reference frame + EB_U32 lcuIndex; + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex){ + paReferenceObject->variance[lcuIndex] = pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64]; + paReferenceObject->yMean[lcuIndex] = pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64]; - } + } - // Get Empty Results Object - EbGetEmptyObject( - contextPtr->pictureAnalysisResultsOutputFifoPtr, - &outputResultsWrapperPtr); + // Get Empty Results Object + EbGetEmptyObject( + contextPtr->pictureAnalysisResultsOutputFifoPtr, + &outputResultsWrapperPtr); - outputResultsPtr = (PictureAnalysisResults_t*)outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; + outputResultsPtr = (PictureAnalysisResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld PA OUT \n", pictureControlSetPtr->pictureNumber); #endif - // Release the Input Results - EbReleaseObject(inputResultsWrapperPtr); + // Release the Input Results + EbReleaseObject(inputResultsWrapperPtr); #if LATENCY_PROFILE double latency = 0.0; @@ -4352,15 +4352,15 @@ void* PictureAnalysisKernel(void *inputPtr) pictureControlSetPtr->decodeOrder, latency); #endif - // Post the Full Results Object - EbPostFullObject(outputResultsWrapperPtr); + // Post the Full Results Object + EbPostFullObject(outputResultsWrapperPtr); - } - return EB_NULL; + } + return EB_NULL; } void UnusedVariablevoidFunc_PA() { - (void)SadCalculation_8x8_16x16_funcPtrArray; - (void)SadCalculation_32x32_64x64_funcPtrArray; + (void)SadCalculation_8x8_16x16_funcPtrArray; + (void)SadCalculation_32x32_64x64_funcPtrArray; } diff --git a/Source/Lib/Codec/EbPictureAnalysisProcess.h b/Source/Lib/Codec/EbPictureAnalysisProcess.h index 4add48e69..4705dd336 100644 --- a/Source/Lib/Codec/EbPictureAnalysisProcess.h +++ b/Source/Lib/Codec/EbPictureAnalysisProcess.h @@ -18,129 +18,129 @@ extern "C" { * Context **************************************/ typedef struct PictureAnalysisContext_s -{ - EB_ALIGN(64) EB_U8 localCache[64]; +{ + EB_ALIGN(64) EB_U8 localCache[64]; EbFifo_t *resourceCoordinationResultsInputFifoPtr; EbFifo_t *pictureAnalysisResultsOutputFifoPtr; - EbPictureBufferDesc_t *denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr; - double picNoiseVarianceFloat; - EB_U16 **grad; + EbPictureBufferDesc_t *denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr; + double picNoiseVarianceFloat; + EB_U16 **grad; } PictureAnalysisContext_t; /*************************************** * Extern Function Declaration ***************************************/ extern EB_ERRORTYPE PictureAnalysisContextCtor( - EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, - EB_BOOL denoiseFlag, + EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, + EB_BOOL denoiseFlag, PictureAnalysisContext_t **contextDblPtr, EbFifo_t *resourceCoordinationResultsInputFifoPtr, EbFifo_t *pictureAnalysisResultsOutputFifoPtr, - EB_U16 lcuTotalCount); - + EB_U16 lcuTotalCount); + extern void* PictureAnalysisKernel(void *inputPtr); void noiseExtractLumaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); typedef void(*EB_WEAKLUMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_WEAKLUMAFILTER_TYPE FUNC_TABLE WeakLumaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractLumaWeak, - // AVX2 - noiseExtractLumaWeak_AVX2_INTRIN, + // C_DEFAULT + noiseExtractLumaWeak, + // AVX2 + noiseExtractLumaWeak_AVX2_INTRIN, }; void noiseExtractLumaWeakLcu( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_WEAKLUMAFILTER_TYPE FUNC_TABLE WeakLumaFilterLcu_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractLumaWeakLcu, - // AVX2 - noiseExtractLumaWeakLcu_AVX2_INTRIN, + // C_DEFAULT + noiseExtractLumaWeakLcu, + // AVX2 + noiseExtractLumaWeakLcu_AVX2_INTRIN, }; void noiseExtractLumaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); typedef void(*EB_STRONGLUMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_STRONGLUMAFILTER_TYPE FUNC_TABLE StrongLumaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractLumaStrong, - // AVX2 - noiseExtractLumaStrong_AVX2_INTRIN, + // C_DEFAULT + noiseExtractLumaStrong, + // AVX2 + noiseExtractLumaStrong_AVX2_INTRIN, }; void noiseExtractChromaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); typedef void(*EB_STRONGCHROMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_STRONGCHROMAFILTER_TYPE FUNC_TABLE StrongChromaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractChromaStrong, - // AVX2 - noiseExtractChromaStrong_AVX2_INTRIN, + // C_DEFAULT + noiseExtractChromaStrong, + // AVX2 + noiseExtractChromaStrong_AVX2_INTRIN, }; void noiseExtractChromaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); typedef void(*EB_WEAKCHROMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_WEAKCHROMAFILTER_TYPE FUNC_TABLE WeakChromaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractChromaWeak, - // AVX2 - noiseExtractChromaWeak_AVX2_INTRIN, + // C_DEFAULT + noiseExtractChromaWeak, + // AVX2 + noiseExtractChromaWeak_AVX2_INTRIN, }; diff --git a/Source/Lib/Codec/EbPictureAnalysisResults.c b/Source/Lib/Codec/EbPictureAnalysisResults.c index d747474c3..cf2a10892 100644 --- a/Source/Lib/Codec/EbPictureAnalysisResults.c +++ b/Source/Lib/Codec/EbPictureAnalysisResults.c @@ -8,7 +8,7 @@ #include "EbPictureAnalysisResults.h" EB_ERRORTYPE PictureAnalysisResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureAnalysisResults_t *objectPtr; @@ -17,7 +17,7 @@ EB_ERRORTYPE PictureAnalysisResultCtor( *objectDblPtr = (EB_PTR) objectPtr; objectInitDataPtr = 0; (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureAnalysisResults.h b/Source/Lib/Codec/EbPictureAnalysisResults.h index 4c43fc289..5f35cb517 100644 --- a/Source/Lib/Codec/EbPictureAnalysisResults.h +++ b/Source/Lib/Codec/EbPictureAnalysisResults.h @@ -29,11 +29,11 @@ typedef struct PictureAnalysisResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureAnalysisResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + #ifdef __cplusplus } #endif -#endif //EbPictureAnalysisResults_h \ No newline at end of file +#endif //EbPictureAnalysisResults_h diff --git a/Source/Lib/Codec/EbPictureBufferDesc.c b/Source/Lib/Codec/EbPictureBufferDesc.c index ace1e0cce..d2ff345cc 100644 --- a/Source/Lib/Codec/EbPictureBufferDesc.c +++ b/Source/Lib/Codec/EbPictureBufferDesc.c @@ -21,7 +21,7 @@ EB_ERRORTYPE EbPictureBufferDescCtor( EbPictureBufferDescInitData_t *pictureBufferDescInitDataPtr = (EbPictureBufferDescInitData_t*) objectInitDataPtr; EB_U32 bytesPerPixel = (pictureBufferDescInitDataPtr->bitDepth == EB_8BIT) ? 1 : 2; - + EB_MALLOC(EbPictureBufferDesc_t*, pictureBufferDescPtr, sizeof(EbPictureBufferDesc_t), EB_N_PTR); // Allocate the PictureBufferDesc Object @@ -38,13 +38,13 @@ EB_ERRORTYPE EbPictureBufferDescCtor( pictureBufferDescPtr->height = pictureBufferDescInitDataPtr->maxHeight; pictureBufferDescPtr->bitDepth = pictureBufferDescInitDataPtr->bitDepth; pictureBufferDescPtr->colorFormat = pictureBufferDescInitDataPtr->colorFormat; - pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; + pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; pictureBufferDescPtr->strideCb = pictureBufferDescPtr->strideCr = pictureBufferDescPtr->strideY >> subWidthCMinus1; - pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; - pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; + pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; + pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; - pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * - (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); + pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * + (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); pictureBufferDescPtr->chromaSize = pictureBufferDescPtr->lumaSize >> (3 - pictureBufferDescInitDataPtr->colorFormat); pictureBufferDescPtr->packedFlag = EB_FALSE; @@ -134,13 +134,13 @@ EB_ERRORTYPE EbReconPictureBufferDescCtor( pictureBufferDescPtr->height = pictureBufferDescInitDataPtr->maxHeight; pictureBufferDescPtr->bitDepth = pictureBufferDescInitDataPtr->bitDepth; pictureBufferDescPtr->colorFormat = pictureBufferDescInitDataPtr->colorFormat; - pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; + pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; pictureBufferDescPtr->strideCb = pictureBufferDescPtr->strideCr = pictureBufferDescPtr->strideY >> subWidthCMinus1; - pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; - pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; + pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; + pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; - pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * - (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); + pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * + (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); pictureBufferDescPtr->chromaSize = pictureBufferDescPtr->lumaSize >> (3 - pictureBufferDescInitDataPtr->colorFormat); pictureBufferDescPtr->packedFlag = EB_FALSE; diff --git a/Source/Lib/Codec/EbPictureBufferDesc.h b/Source/Lib/Codec/EbPictureBufferDesc.h index 94674da8b..6d4f8981e 100644 --- a/Source/Lib/Codec/EbPictureBufferDesc.h +++ b/Source/Lib/Codec/EbPictureBufferDesc.h @@ -6,7 +6,7 @@ #ifndef EbPictureBuffer_h #define EbPictureBuffer_h -#include +#include #include "EbDefinitions.h" @@ -22,44 +22,44 @@ extern "C" { #define PICTURE_BUFFER_DESC_FULL_MASK (PICTURE_BUFFER_DESC_Y_FLAG | PICTURE_BUFFER_DESC_Cb_FLAG | PICTURE_BUFFER_DESC_Cr_FLAG) /************************************ - * EbPictureBufferDesc + * EbPictureBufferDesc ************************************/ typedef struct EbPictureBufferDesc_s -{ - // Buffer Ptrs - EB_BYTE bufferY; // Pointer to the Y luma buffer - EB_BYTE bufferCb; // Pointer to the U chroma buffer - EB_BYTE bufferCr; // Pointer to the V chroma buffer - //Bit increment - EB_BYTE bufferBitIncY; // Pointer to the Y luma buffer Bit increment - EB_BYTE bufferBitIncCb; // Pointer to the U chroma buffer Bit increment - EB_BYTE bufferBitIncCr; // Pointer to the V chroma buffer Bit increment - - EB_U16 strideY; // Pointer to the Y luma buffer - EB_U16 strideCb; // Pointer to the U chroma buffer - EB_U16 strideCr; // Pointer to the V chroma buffer - - EB_U16 strideBitIncY; // Pointer to the Y luma buffer Bit increment - EB_U16 strideBitIncCb; // Pointer to the U chroma buffer Bit increment - EB_U16 strideBitIncCr; // Pointer to the V chroma buffer Bit increment - - // Picture Parameters - EB_U16 originX; // Horizontal padding distance - EB_U16 originY; // Vertical padding distance - EB_U16 width; // Luma picture width which excludes the padding - EB_U16 height; // Luma picture height which excludes the padding - EB_U16 maxWidth; // Luma picture width - EB_U16 maxHeight; // Luma picture height - EB_BITDEPTH bitDepth; // Pixel Bit Depth +{ + // Buffer Ptrs + EB_BYTE bufferY; // Pointer to the Y luma buffer + EB_BYTE bufferCb; // Pointer to the U chroma buffer + EB_BYTE bufferCr; // Pointer to the V chroma buffer + //Bit increment + EB_BYTE bufferBitIncY; // Pointer to the Y luma buffer Bit increment + EB_BYTE bufferBitIncCb; // Pointer to the U chroma buffer Bit increment + EB_BYTE bufferBitIncCr; // Pointer to the V chroma buffer Bit increment + + EB_U16 strideY; // Pointer to the Y luma buffer + EB_U16 strideCb; // Pointer to the U chroma buffer + EB_U16 strideCr; // Pointer to the V chroma buffer + + EB_U16 strideBitIncY; // Pointer to the Y luma buffer Bit increment + EB_U16 strideBitIncCb; // Pointer to the U chroma buffer Bit increment + EB_U16 strideBitIncCr; // Pointer to the V chroma buffer Bit increment + + // Picture Parameters + EB_U16 originX; // Horizontal padding distance + EB_U16 originY; // Vertical padding distance + EB_U16 width; // Luma picture width which excludes the padding + EB_U16 height; // Luma picture height which excludes the padding + EB_U16 maxWidth; // Luma picture width + EB_U16 maxHeight; // Luma picture height + EB_BITDEPTH bitDepth; // Pixel Bit Depth EB_COLOR_FORMAT colorFormat; // Chroma subsampling format - // Buffer Parameters - EB_U32 lumaSize; // Size of the luma buffer - EB_U32 chromaSize; // Size of the chroma buffers - EB_BOOL packedFlag; // Indicates if sample buffers are packed or not + // Buffer Parameters + EB_U32 lumaSize; // Size of the luma buffer + EB_U32 chromaSize; // Size of the chroma buffers + EB_BOOL packedFlag; // Indicates if sample buffers are packed or not - EB_SEI_MESSAGE dolbyVisionRpu; - EB_SEI_MESSAGE userSeiMsg; + EB_SEI_MESSAGE dolbyVisionRpu; + EB_SEI_MESSAGE userSeiMsg; } EbPictureBufferDesc_t; @@ -73,23 +73,23 @@ typedef struct EbPictureBufferDescInitData_s EB_BITDEPTH bitDepth; EB_COLOR_FORMAT colorFormat; EB_U32 bufferEnableMask; - EB_U16 leftPadding; - EB_U16 rightPadding; - EB_U16 topPadding; - EB_U16 botPadding; + EB_U16 leftPadding; + EB_U16 rightPadding; + EB_U16 topPadding; + EB_U16 botPadding; EB_BOOL splitMode; //ON: allocate 8bit data separately from nbit data - + } EbPictureBufferDescInitData_t; /************************************** * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EbPictureBufferDescCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE EbReconPictureBufferDescCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureDecisionProcess.c b/Source/Lib/Codec/EbPictureDecisionProcess.c index a4c7b194b..50cfc849a 100644 --- a/Source/Lib/Codec/EbPictureDecisionProcess.c +++ b/Source/Lib/Codec/EbPictureDecisionProcess.c @@ -31,8 +31,8 @@ #define FLASH_TH 5 #define FADE_TH 3 #define SCENE_TH 3000 -#define NOISY_SCENE_TH 4500 // SCD TH in presence of noise -#define HIGH_PICTURE_VARIANCE_TH 1500 +#define NOISY_SCENE_TH 4500 // SCD TH in presence of noise +#define HIGH_PICTURE_VARIANCE_TH 1500 #define NUM64x64INPIC(w,h) ((w*h)>> (LOG2F(MAX_LCU_SIZE)<<1)) #define QUEUE_GET_PREVIOUS_SPOT(h) ((h == 0) ? PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1 : h - 1) #define QUEUE_GET_NEXT_SPOT(h,off) (( (h+off) >= PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH) ? h+off - PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH : h + off) @@ -53,35 +53,35 @@ EB_ERRORTYPE PictureDecisionContextCtor( contextPtr->pictureAnalysisResultsInputFifoPtr = pictureAnalysisResultsInputFifoPtr; contextPtr->pictureDecisionResultsOutputFifoPtr = pictureDecisionResultsOutputFifoPtr; - - EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCb, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCr, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); + EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCb, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvg, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); + EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCr, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - for (arrayIndex = 0; arrayIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrayIndex++) - { - EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCb[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); + EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvg, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCr[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); + for (arrayIndex = 0; arrayIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrayIndex++) + { + EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCb[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvg[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - } + EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCr[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - for (arrayRow = 0; arrayRow < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; arrayRow++) - { - for (arrowColumn = 0; arrowColumn < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrowColumn++) { - contextPtr->ahdRunningAvgCb[arrowColumn][arrayRow] = 0; - contextPtr->ahdRunningAvgCr[arrowColumn][arrayRow] = 0; - contextPtr->ahdRunningAvg[arrowColumn][arrayRow] = 0; - } - } + EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvg[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); + } + + for (arrayRow = 0; arrayRow < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; arrayRow++) + { + for (arrowColumn = 0; arrowColumn < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrowColumn++) { + contextPtr->ahdRunningAvgCb[arrowColumn][arrayRow] = 0; + contextPtr->ahdRunningAvgCr[arrowColumn][arrayRow] = 0; + contextPtr->ahdRunningAvg[arrowColumn][arrayRow] = 0; + } + } contextPtr->resetRunningAvg = EB_TRUE; - contextPtr->isSceneChangeDetected = EB_FALSE; + contextPtr->isSceneChangeDetected = EB_FALSE; return EB_ErrorNone; @@ -89,259 +89,259 @@ EB_ERRORTYPE PictureDecisionContextCtor( static EB_BOOL SceneTransitionDetector( PictureDecisionContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t **ParentPcsWindow, - EB_U32 windowWidthFuture) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t **ParentPcsWindow, + EB_U32 windowWidthFuture) { - PictureParentControlSet_t *previousPictureControlSetPtr = ParentPcsWindow[0]; - PictureParentControlSet_t *currentPictureControlSetPtr = ParentPcsWindow[1]; - PictureParentControlSet_t *futurePictureControlSetPtr = ParentPcsWindow[2]; - - // calculating the frame threshold based on the number of 64x64 blocks in the frame - EB_U32 regionThreshHold; - EB_U32 regionThreshHoldChroma; - // this variable determines whether the running average should be reset to equal the ahd or not after detecting a scene change. + PictureParentControlSet_t *previousPictureControlSetPtr = ParentPcsWindow[0]; + PictureParentControlSet_t *currentPictureControlSetPtr = ParentPcsWindow[1]; + PictureParentControlSet_t *futurePictureControlSetPtr = ParentPcsWindow[2]; + + // calculating the frame threshold based on the number of 64x64 blocks in the frame + EB_U32 regionThreshHold; + EB_U32 regionThreshHoldChroma; + // this variable determines whether the running average should be reset to equal the ahd or not after detecting a scene change. //EB_BOOL resetRunningAvg = contextPtr->resetRunningAvg; - EB_BOOL isAbruptChange; // this variable signals an abrubt change (scene change or flash) - EB_BOOL isSceneChange; // this variable signals a frame representing a scene change - EB_BOOL isFlash; // this variable signals a frame that contains a flash - EB_BOOL isFade; // this variable signals a frame that contains a fade - EB_BOOL gradualChange; // this signals the detection of a light scene change a small/localized flash or the start of a fade + EB_BOOL isAbruptChange; // this variable signals an abrubt change (scene change or flash) + EB_BOOL isSceneChange; // this variable signals a frame representing a scene change + EB_BOOL isFlash; // this variable signals a frame that contains a flash + EB_BOOL isFade; // this variable signals a frame that contains a fade + EB_BOOL gradualChange; // this signals the detection of a light scene change a small/localized flash or the start of a fade - EB_U32 ahd; // accumulative histogram (absolute) differences between the past and current frame + EB_U32 ahd; // accumulative histogram (absolute) differences between the past and current frame - EB_U32 ahdCb; - EB_U32 ahdCr; + EB_U32 ahdCb; + EB_U32 ahdCr; - EB_U32 ahdErrorCb = 0; - EB_U32 ahdErrorCr = 0; + EB_U32 ahdErrorCb = 0; + EB_U32 ahdErrorCr = 0; EB_U32 **ahdRunningAvgCb = contextPtr->ahdRunningAvgCb; EB_U32 **ahdRunningAvgCr = contextPtr->ahdRunningAvgCr; EB_U32 **ahdRunningAvg = contextPtr->ahdRunningAvg; - - EB_U32 ahdError = 0; // the difference between the ahd and the running average at the current frame. - - EB_U8 aidFuturePast = 0; // this variable denotes the average intensity difference between the next and the past frames - EB_U8 aidFuturePresent = 0; - EB_U8 aidPresentPast = 0; - - EB_U32 bin = 0; // variable used to iterate through the bins of the histograms - - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; - - EB_U32 regionWidth; - EB_U32 regionHeight; - EB_U32 regionWidthOffset; - EB_U32 regionHeightOffset; - - EB_U32 isAbruptChangeCount = 0; - EB_U32 isSceneChangeCount = 0; - - EB_U32 regionCountThreshold = (sequenceControlSetPtr->scdMode == SCD_MODE_2) ? - (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 75) / 100) + 0.5) : - (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 50) / 100) + 0.5) ; - - regionWidth = ParentPcsWindow[1]->enhancedPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; - regionHeight = ParentPcsWindow[1]->enhancedPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; - - // Loop over regions inside the picture - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions - - isAbruptChange = EB_FALSE; + + EB_U32 ahdError = 0; // the difference between the ahd and the running average at the current frame. + + EB_U8 aidFuturePast = 0; // this variable denotes the average intensity difference between the next and the past frames + EB_U8 aidFuturePresent = 0; + EB_U8 aidPresentPast = 0; + + EB_U32 bin = 0; // variable used to iterate through the bins of the histograms + + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; + + EB_U32 regionWidth; + EB_U32 regionHeight; + EB_U32 regionWidthOffset; + EB_U32 regionHeightOffset; + + EB_U32 isAbruptChangeCount = 0; + EB_U32 isSceneChangeCount = 0; + + EB_U32 regionCountThreshold = (sequenceControlSetPtr->scdMode == SCD_MODE_2) ? + (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 75) / 100) + 0.5) : + (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 50) / 100) + 0.5) ; + + regionWidth = ParentPcsWindow[1]->enhancedPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; + regionHeight = ParentPcsWindow[1]->enhancedPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; + + // Loop over regions inside the picture + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions + + isAbruptChange = EB_FALSE; isSceneChange = EB_FALSE; isFlash = EB_FALSE; - gradualChange = EB_FALSE; - - // Reset accumulative histogram (absolute) differences between the past and current frame - ahd = 0; - ahdCb = 0; - ahdCr = 0; + gradualChange = EB_FALSE; + + // Reset accumulative histogram (absolute) differences between the past and current frame + ahd = 0; + ahdCb = 0; + ahdCr = 0; - regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? - ParentPcsWindow[1]->enhancedPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : - 0; + regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? + ParentPcsWindow[1]->enhancedPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : + 0; - regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? - ParentPcsWindow[1]->enhancedPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : - 0; + regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? + ParentPcsWindow[1]->enhancedPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : + 0; - regionWidth += regionWidthOffset; - regionHeight += regionHeightOffset; + regionWidth += regionWidthOffset; + regionHeight += regionHeightOffset; - regionThreshHold = ( - // Noise insertion/removal detection - ((ABS((EB_S64)currentPictureControlSetPtr->picAvgVariance - (EB_S64)previousPictureControlSetPtr->picAvgVariance)) > NOISE_VARIANCE_TH) && - (currentPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH || previousPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH)) ? - NOISY_SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) : // SCD TH function of noise insertion/removal. - SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) ; + regionThreshHold = ( + // Noise insertion/removal detection + ((ABS((EB_S64)currentPictureControlSetPtr->picAvgVariance - (EB_S64)previousPictureControlSetPtr->picAvgVariance)) > NOISE_VARIANCE_TH) && + (currentPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH || previousPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH)) ? + NOISY_SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) : // SCD TH function of noise insertion/removal. + SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) ; - regionThreshHoldChroma = regionThreshHold / 4; + regionThreshHoldChroma = regionThreshHold / 4; - for (bin = 0; bin < HISTOGRAM_NUMBER_OF_BINS; ++bin) { - ahd += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin]); - ahdCb += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin]); - ahdCr += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin]); + for (bin = 0; bin < HISTOGRAM_NUMBER_OF_BINS; ++bin) { + ahd += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin]); + ahdCb += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin]); + ahdCr += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin]); - } + } - if (contextPtr->resetRunningAvg){ - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahd; - ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCb; - ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCr; - } + if (contextPtr->resetRunningAvg){ + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahd; + ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCb; + ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCr; + } - ahdError = ABS((EB_S32)ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahd); - ahdErrorCb = ABS((EB_S32)ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCb); - ahdErrorCr = ABS((EB_S32)ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCr); + ahdError = ABS((EB_S32)ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahd); + ahdErrorCb = ABS((EB_S32)ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCb); + ahdErrorCr = ABS((EB_S32)ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCr); - if ((ahdError > regionThreshHold && ahd >= ahdError) || - (ahdErrorCb > regionThreshHoldChroma && ahdCb >= ahdErrorCb) || - (ahdErrorCr > regionThreshHoldChroma && ahdCr >= ahdErrorCr)){ + if ((ahdError > regionThreshHold && ahd >= ahdError) || + (ahdErrorCb > regionThreshHoldChroma && ahdCb >= ahdErrorCb) || + (ahdErrorCr > regionThreshHoldChroma && ahdCr >= ahdErrorCr)){ - isAbruptChange = EB_TRUE; + isAbruptChange = EB_TRUE; - } - else if ((ahdError > (regionThreshHold >> 1)) && ahd >= ahdError){ - gradualChange = EB_TRUE; - } + } + else if ((ahdError > (regionThreshHold >> 1)) && ahd >= ahdError){ + gradualChange = EB_TRUE; + } - if (isAbruptChange) - { - aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); - aidFuturePresent = (EB_U8)ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); - aidPresentPast = (EB_U8)ABS((EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + if (isAbruptChange) + { + aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + aidFuturePresent = (EB_U8)ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + aidPresentPast = (EB_U8)ABS((EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); if (aidFuturePast < FLASH_TH && aidFuturePresent >= FLASH_TH && aidPresentPast >= FLASH_TH){ - isFlash = EB_TRUE; - //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - } - else if (aidFuturePresent < FADE_TH && aidPresentPast < FADE_TH){ - isFade = EB_TRUE; - //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - } else { - isSceneChange = EB_TRUE; - //SVT_LOG ("\nScene Change in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - } - - } - else if (gradualChange){ - - aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); - if (aidFuturePast < FLASH_TH){ - // proper action to be signalled - //SVT_LOG ("\nLight Flash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; - } - else{ - // proper action to be signalled - //SVT_LOG ("\nLight Scene Change / fade detected in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; - } - - } - else{ - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; - } - - isAbruptChangeCount += isAbruptChange; - isSceneChangeCount += isSceneChange; - } - } - - (void)windowWidthFuture; - (void)isFlash; - (void)isFade; - - if (isAbruptChangeCount >= regionCountThreshold) { - contextPtr->resetRunningAvg = EB_TRUE; - } - else { - contextPtr->resetRunningAvg = EB_FALSE; - } + isFlash = EB_TRUE; + //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + } + else if (aidFuturePresent < FADE_TH && aidPresentPast < FADE_TH){ + isFade = EB_TRUE; + //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + } else { + isSceneChange = EB_TRUE; + //SVT_LOG ("\nScene Change in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + } + + } + else if (gradualChange){ + + aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + if (aidFuturePast < FLASH_TH){ + // proper action to be signalled + //SVT_LOG ("\nLight Flash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; + } + else{ + // proper action to be signalled + //SVT_LOG ("\nLight Scene Change / fade detected in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; + } + + } + else{ + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; + } + + isAbruptChangeCount += isAbruptChange; + isSceneChangeCount += isSceneChange; + } + } + + (void)windowWidthFuture; + (void)isFlash; + (void)isFade; + + if (isAbruptChangeCount >= regionCountThreshold) { + contextPtr->resetRunningAvg = EB_TRUE; + } + else { + contextPtr->resetRunningAvg = EB_FALSE; + } if ((isSceneChangeCount >= regionCountThreshold)){ - return(EB_TRUE); - } - else { - return(EB_FALSE); - } - + return(EB_TRUE); + } + else { + return(EB_FALSE); + } + } /*************************************************************************************************** * ReleasePrevPictureFromReorderQueue ***************************************************************************************************/ EB_ERRORTYPE ReleasePrevPictureFromReorderQueue( - EncodeContext_t *encodeContextPtr) { + EncodeContext_t *encodeContextPtr) { + + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_ERRORTYPE return_error = EB_ErrorNone; + PictureDecisionReorderEntry_t *queuePreviousEntryPtr; + EB_S32 previousEntryIndex; - PictureDecisionReorderEntry_t *queuePreviousEntryPtr; - EB_S32 previousEntryIndex; - - // Get the previous entry from the Picture Decision Reordering Queue (Entry N-1) - // P.S. The previous entry in display order is needed for Scene Change Detection - previousEntryIndex = (encodeContextPtr->pictureDecisionReorderQueueHeadIndex == 0) ? PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1 : encodeContextPtr->pictureDecisionReorderQueueHeadIndex - 1; - queuePreviousEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[previousEntryIndex]; + // Get the previous entry from the Picture Decision Reordering Queue (Entry N-1) + // P.S. The previous entry in display order is needed for Scene Change Detection + previousEntryIndex = (encodeContextPtr->pictureDecisionReorderQueueHeadIndex == 0) ? PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1 : encodeContextPtr->pictureDecisionReorderQueueHeadIndex - 1; + queuePreviousEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[previousEntryIndex]; - // LCU activity classification based on (0,0) SAD & picture activity derivation - if (queuePreviousEntryPtr->parentPcsWrapperPtr) { + // LCU activity classification based on (0,0) SAD & picture activity derivation + if (queuePreviousEntryPtr->parentPcsWrapperPtr) { - // Reset the Picture Decision Reordering Queue Entry - // P.S. The reset of the Picture Decision Reordering Queue Entry could not be done before running the Scene Change Detector - queuePreviousEntryPtr->pictureNumber += PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; - queuePreviousEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - } + // Reset the Picture Decision Reordering Queue Entry + // P.S. The reset of the Picture Decision Reordering Queue Entry could not be done before running the Scene Change Detector + queuePreviousEntryPtr->pictureNumber += PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; + queuePreviousEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; + } - return return_error; + return return_error; } /*************************************************************************************************** * Generates mini GOP RPSs * -* +* ***************************************************************************************************/ EB_ERRORTYPE GenerateMiniGopRps( - PictureDecisionContext_t *contextPtr, - EncodeContext_t *encodeContextPtr) { + PictureDecisionContext_t *contextPtr, + EncodeContext_t *encodeContextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 miniGopIndex; - PictureParentControlSet_t *pictureControlSetPtr; - EB_U32 pictureIndex; + EB_U32 miniGopIndex; + PictureParentControlSet_t *pictureControlSetPtr; + EB_U32 pictureIndex; - SequenceControlSet_t *sequenceControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; - // Loop over all mini GOPs - for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { + // Loop over all mini GOPs + for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { - // Loop over picture within the mini GOP - for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; pictureIndex++) { + // Loop over picture within the mini GOP + for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; pictureIndex++) { - pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; + pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; pictureControlSetPtr->hierarchicalLevels = (EB_U8)contextPtr->miniGopHierarchicalLevels[miniGopIndex]; pictureControlSetPtr->predStructPtr = GetPredictionStructure( - encodeContextPtr->predictionStructureGroupPtr, - pictureControlSetPtr->predStructure, - 1, - pictureControlSetPtr->hierarchicalLevels); - } - } - return return_error; + encodeContextPtr->predictionStructureGroupPtr, + pictureControlSetPtr->predStructure, + 1, + pictureControlSetPtr->hierarchicalLevels); + } + } + return return_error; } /*************************************************************************** @@ -349,39 +349,39 @@ EB_ERRORTYPE GenerateMiniGopRps( ****************************************************************************/ EB_U8 PictureLevelSubPelSettingsOq( - EB_U8 inputResolution, - EB_U8 encMode, - EB_U8 temporalLayerIndex, - EB_BOOL isUsedAsReferenceFlag) { - - EB_U8 subPelMode; - - if (encMode <= ENC_MODE_8) { - subPelMode = 1; - } - else if (encMode <= ENC_MODE_9) { - if (inputResolution >= INPUT_SIZE_4K_RANGE) { - subPelMode = (temporalLayerIndex == 0) ? 1 : 0; - } - else { - subPelMode = 1; - } + EB_U8 inputResolution, + EB_U8 encMode, + EB_U8 temporalLayerIndex, + EB_BOOL isUsedAsReferenceFlag) { + + EB_U8 subPelMode; + + if (encMode <= ENC_MODE_8) { + subPelMode = 1; + } + else if (encMode <= ENC_MODE_9) { + if (inputResolution >= INPUT_SIZE_4K_RANGE) { + subPelMode = (temporalLayerIndex == 0) ? 1 : 0; + } + else { + subPelMode = 1; + } } else { - if (inputResolution >= INPUT_SIZE_4K_RANGE) { + if (inputResolution >= INPUT_SIZE_4K_RANGE) { if (encMode > ENC_MODE_10) { subPelMode = 0; } else { subPelMode = (temporalLayerIndex == 0) ? 1 : 0; } - } - else { - subPelMode = isUsedAsReferenceFlag ? 1 : 0; - } + } + else { + subPelMode = isUsedAsReferenceFlag ? 1 : 0; + } } - return subPelMode; + return subPelMode; } @@ -397,14 +397,14 @@ EB_ERRORTYPE SignalDerivationMultiProcessesOq( EB_ERRORTYPE return_error = EB_ErrorNone; // Set MD Partitioning Method - if (pictureControlSetPtr->encMode <= ENC_MODE_3) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - pictureControlSetPtr->depthMode = PICT_FULL84_DEPTH_MODE; - } - else { - pictureControlSetPtr->depthMode = PICT_FULL85_DEPTH_MODE; - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_3) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + pictureControlSetPtr->depthMode = PICT_FULL84_DEPTH_MODE; + } + else { + pictureControlSetPtr->depthMode = PICT_FULL85_DEPTH_MODE; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_10) { if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { pictureControlSetPtr->depthMode = PICT_FULL84_DEPTH_MODE; @@ -422,7 +422,7 @@ EB_ERRORTYPE SignalDerivationMultiProcessesOq( pictureControlSetPtr->depthMode = PICT_LCU_SWITCH_DEPTH_MODE; } } - + // Set the default settings of subpel pictureControlSetPtr->useSubpelFlag = PictureLevelSubPelSettingsOq( sequenceControlSetPtr->inputResolution, @@ -442,31 +442,31 @@ EB_ERRORTYPE SignalDerivationMultiProcessesOq( if (pictureControlSetPtr->encMode <= ENC_MODE_2 ) { pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_0; } - else if (pictureControlSetPtr->encMode <= ENC_MODE_5) { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } - else { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } - } + else if (pictureControlSetPtr->encMode <= ENC_MODE_5) { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } + else { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; - } - else { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; + } + else { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } } - else { - pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; + else { + pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; } - + // CU_16x16 Search Mode - pictureControlSetPtr->cu16x16Mode = CU_16x16_MODE_0; + pictureControlSetPtr->cu16x16Mode = CU_16x16_MODE_0; // Set Skip OIS 8x8 Flag pictureControlSetPtr->skipOis8x8 = (pictureControlSetPtr->sliceType == EB_I_PICTURE && (pictureControlSetPtr->encMode <= ENC_MODE_10)) ? EB_FALSE : EB_TRUE; @@ -477,109 +477,109 @@ EB_ERRORTYPE SignalDerivationMultiProcessesOq( /*************************************************************************************************** * Picture Decision Kernel - * - * Notes on the Picture Decision: - * - * The Picture Decision process performs multi-picture level decisions, including setting of the prediction structure, + * + * Notes on the Picture Decision: + * + * The Picture Decision process performs multi-picture level decisions, including setting of the prediction structure, * setting the picture type and scene change detection. * * Inputs: - * Input Picture - * -Input Picture Data - * - * Outputs: - * -Picture Control Set with fully available PA Reference List - * - * For Low Delay Sequences, pictures are started into the encoder pipeline immediately. - * + * Input Picture + * -Input Picture Data + * + * Outputs: + * -Picture Control Set with fully available PA Reference List + * + * For Low Delay Sequences, pictures are started into the encoder pipeline immediately. + * * For Random Access Sequences, pictures are held for up to a PredictionStructurePeriod - * in order to determine if a Scene Change or Intra Frame is forthcoming. Either of - * those events (and additionally a End of Sequence Flag) will change the expected + * in order to determine if a Scene Change or Intra Frame is forthcoming. Either of + * those events (and additionally a End of Sequence Flag) will change the expected * prediction structure. * - * Below is an example worksheet for how Intra Flags and Scene Change Flags interact + * Below is an example worksheet for how Intra Flags and Scene Change Flags interact * together to affect the prediction structure. * - * The base prediction structure for this example is a 3-Level Hierarchical Random Access, - * Single Reference Prediction Structure: - * - * b b - * / \ / \ - * / B \ - * / / \ \ - * I-----------B - * - * From this base structure, the following RPS positions are derived: - * - * p p b b p p - * \ \ / \ / \ / / - * P \ / B \ / P - * \ \ / / \ \ / / - * ----I-----------B---- - * - * L L L I [ Normal ] T T T - * 2 1 0 n 0 1 2 - * t - * r - * a - * + * The base prediction structure for this example is a 3-Level Hierarchical Random Access, + * Single Reference Prediction Structure: + * + * b b + * / \ / \ + * / B \ + * / / \ \ + * I-----------B + * + * From this base structure, the following RPS positions are derived: + * + * p p b b p p + * \ \ / \ / \ / / + * P \ / B \ / P + * \ \ / / \ \ / / + * ----I-----------B---- + * + * L L L I [ Normal ] T T T + * 2 1 0 n 0 1 2 + * t + * r + * a + * * The RPS is composed of Leading Picture [L2-L0], Intra (CRA), Base/Normal Pictures, * and Trailing Pictures [T0-T2]. Generally speaking, Leading Pictures are useful - * for handling scene changes without adding extraneous I-pictures and the Trailing + * for handling scene changes without adding extraneous I-pictures and the Trailing * pictures are useful for terminating GOPs. * * Here is a table of possible combinations of pictures needed to handle intra and * scene changes happening in quick succession. - * - * Distance to scene change ------------> - * - * 0 1 2 3+ - * I - * n - * t 0 I I n/a n/a n/a - * r - * a p p - * \ / - * P 1 I I I I n/a n/a - * e - * r p p - * i \ / - * o p \ p p / p - * d \ \ / \ / / + * + * Distance to scene change ------------> + * + * 0 1 2 3+ + * I + * n + * t 0 I I n/a n/a n/a + * r + * a p p + * \ / + * P 1 I I I I n/a n/a + * e + * r p p + * i \ / + * o p \ p p / p + * d \ \ / \ / / * 2 I -----I I I I---- I n/a - * | - * | p p p p p p p p - * | \ \ / \ / \ / / - * | P \ / p \ / p \ / P - * | \ \ / \ \ / / \ / / - * V 3+ I ----I I ----I I---- I I---- I - * - * The table is interpreted as follows: - * - * If there are no SCs or Intras encountered for a PredPeriod, then the normal - * prediction structure is applied. - * + * | + * | p p p p p p p p + * | \ \ / \ / \ / / + * | P \ / p \ / p \ / P + * | \ \ / \ \ / / \ / / + * V 3+ I ----I I ----I I---- I I---- I + * + * The table is interpreted as follows: + * + * If there are no SCs or Intras encountered for a PredPeriod, then the normal + * prediction structure is applied. + * * If there is an intra in the PredPeriod, then one of the above combinations of * Leading and Trailing pictures is used. If there is no scene change, the last * valid column consisting of Trailing Pictures only is used. However, if there - * is an upcoming scene change before the next intra, then one of the above patterns + * is an upcoming scene change before the next intra, then one of the above patterns * is used. In the case of End of Sequence flags, only the last valid column of Trailing * Pictures is used. The intention here is that any combination of Intra Flag and Scene - * Change flag can be coded. - * + * Change flag can be coded. + * ***************************************************************************************************/ void* PictureDecisionKernel(void *inputPtr) { - PictureDecisionContext_t *contextPtr = (PictureDecisionContext_t*) inputPtr; + PictureDecisionContext_t *contextPtr = (PictureDecisionContext_t*) inputPtr; - PictureParentControlSet_t *pictureControlSetPtr; + PictureParentControlSet_t *pictureControlSetPtr; EncodeContext_t *encodeContextPtr; SequenceControlSet_t *sequenceControlSetPtr; - + EbObjectWrapper_t *inputResultsWrapperPtr; PictureAnalysisResults_t *inputResultsPtr; - + EbObjectWrapper_t *outputResultsWrapperPtr; PictureDecisionResults_t *outputResultsPtr; @@ -587,17 +587,17 @@ void* PictureDecisionKernel(void *inputPtr) EB_BOOL preAssignmentBufferFirstPassFlag; EB_PICTURE pictureType; - - PictureDecisionReorderEntry_t *queueEntryPtr; + + PictureDecisionReorderEntry_t *queueEntryPtr; EB_S32 queueEntryIndex; - EB_S32 previousEntryIndex; + EB_S32 previousEntryIndex; PaReferenceQueueEntry_t *inputEntryPtr; EB_U32 inputQueueIndex; PaReferenceQueueEntry_t *paReferenceEntryPtr; - EB_U32 paReferenceQueueIndex; + EB_U32 paReferenceQueueIndex; EB_U64 refPoc; @@ -606,27 +606,27 @@ void* PictureDecisionKernel(void *inputPtr) EB_U32 depListCount; - // Dynamic GOP - EB_U32 miniGopIndex; - EB_U32 pictureIndex; + // Dynamic GOP + EB_U32 miniGopIndex; + EB_U32 pictureIndex; - EB_BOOL windowAvail,framePasseThru; + EB_BOOL windowAvail,framePasseThru; EB_U32 windowIndex; EB_U32 entryIndex; PictureParentControlSet_t *ParentPcsWindow[FUTURE_WINDOW_WIDTH+2]; // Debug EB_U64 loopCount = 0; - + for(;;) { - + // Get Input Full Object EbGetFullObject( contextPtr->pictureAnalysisResultsInputFifoPtr, &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - - inputResultsPtr = (PictureAnalysisResults_t*) inputResultsWrapperPtr->objectPtr; + + inputResultsPtr = (PictureAnalysisResults_t*) inputResultsWrapperPtr->objectPtr; pictureControlSetPtr = (PictureParentControlSet_t*) inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; sequenceControlSetPtr = (SequenceControlSet_t*) pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; encodeContextPtr = (EncodeContext_t*) sequenceControlSetPtr->encodeContextPtr; @@ -638,28 +638,28 @@ void* PictureDecisionKernel(void *inputPtr) loopCount ++; // Input Picture Analysis Results into the Picture Decision Reordering Queue - // P.S. Since the prior Picture Analysis processes stage is multithreaded, inputs to the Picture Decision Process - // can arrive out-of-display-order, so a the Picture Decision Reordering Queue is used to enforce processing of + // P.S. Since the prior Picture Analysis processes stage is multithreaded, inputs to the Picture Decision Process + // can arrive out-of-display-order, so a the Picture Decision Reordering Queue is used to enforce processing of // pictures in display order - queueEntryIndex = (EB_S32) (pictureControlSetPtr->pictureNumber - encodeContextPtr->pictureDecisionReorderQueue[encodeContextPtr->pictureDecisionReorderQueueHeadIndex]->pictureNumber); + queueEntryIndex = (EB_S32) (pictureControlSetPtr->pictureNumber - encodeContextPtr->pictureDecisionReorderQueue[encodeContextPtr->pictureDecisionReorderQueueHeadIndex]->pictureNumber); queueEntryIndex += encodeContextPtr->pictureDecisionReorderQueueHeadIndex; - queueEntryIndex = (queueEntryIndex > PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH : queueEntryIndex; - queueEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[queueEntryIndex]; + queueEntryIndex = (queueEntryIndex > PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH : queueEntryIndex; + queueEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[queueEntryIndex]; if(queueEntryPtr->parentPcsWrapperPtr != NULL){ CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_PD_ERROR8); }else{ queueEntryPtr->parentPcsWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; queueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; } - // Process the head of the Picture Decision Reordering Queue (Entry N) + // Process the head of the Picture Decision Reordering Queue (Entry N) // P.S. The Picture Decision Reordering Queue should be parsed in the display order to be able to construct a pred structure queueEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[encodeContextPtr->pictureDecisionReorderQueueHeadIndex]; - + while(queueEntryPtr->parentPcsWrapperPtr != EB_NULL) { - + if(queueEntryPtr->pictureNumber == 0 || sequenceControlSetPtr->staticConfig.sceneChangeDetection == 0 || ((PictureParentControlSet_t *)(queueEntryPtr->parentPcsWrapperPtr->objectPtr))->endOfSequenceFlag == EB_TRUE){ @@ -667,8 +667,8 @@ void* PictureDecisionKernel(void *inputPtr) }else{ framePasseThru = EB_FALSE; } - windowAvail = EB_TRUE; - previousEntryIndex = QUEUE_GET_PREVIOUS_SPOT(encodeContextPtr->pictureDecisionReorderQueueHeadIndex); + windowAvail = EB_TRUE; + previousEntryIndex = QUEUE_GET_PREVIOUS_SPOT(encodeContextPtr->pictureDecisionReorderQueueHeadIndex); if(encodeContextPtr->pictureDecisionReorderQueue[previousEntryIndex]->parentPcsWrapperPtr == NULL){ windowAvail = EB_FALSE; @@ -690,7 +690,7 @@ void* PictureDecisionKernel(void *inputPtr) ParentPcsWindow[2+windowIndex] =(PictureParentControlSet_t *) encodeContextPtr->pictureDecisionReorderQueue[entryIndex]->parentPcsWrapperPtr->objectPtr; } } - } + } pictureControlSetPtr = (PictureParentControlSet_t*) queueEntryPtr->parentPcsWrapperPtr->objectPtr; if(pictureControlSetPtr->idrFlag == EB_TRUE) @@ -712,27 +712,27 @@ void* PictureDecisionKernel(void *inputPtr) } if(windowAvail == EB_TRUE ||framePasseThru == EB_TRUE) - { + { // Place the PCS into the Pre-Assignment Buffer // P.S. The Pre-Assignment Buffer is used to store a whole pre-structure encodeContextPtr->preAssignmentBuffer[encodeContextPtr->preAssignmentBufferCount] = queueEntryPtr->parentPcsWrapperPtr; - + // Setup the PCS & SCS pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[encodeContextPtr->preAssignmentBufferCount]->objectPtr; - + // Set the POC Number pictureControlSetPtr->pictureNumber = (encodeContextPtr->currentInputPoc + 1) /*& ((1 << sequenceControlSetPtr->bitsForPictureOrderCount)-1)*/; encodeContextPtr->currentInputPoc = pictureControlSetPtr->pictureNumber; - pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; + pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; + + pictureControlSetPtr->hierarchicalLayersDiff = 0; - pictureControlSetPtr->hierarchicalLayersDiff = 0; - pictureControlSetPtr->initPredStructPositionFlag = EB_FALSE; - + pictureControlSetPtr->targetBitRate = sequenceControlSetPtr->staticConfig.targetBitRate; - pictureControlSetPtr->droppedFramesNumber = 0; + pictureControlSetPtr->droppedFramesNumber = 0; ReleasePrevPictureFromReorderQueue( encodeContextPtr); @@ -777,245 +777,245 @@ void* PictureDecisionKernel(void *inputPtr) 0 : encodeContextPtr->intraPeriodPosition + 1; } - // Determine if Pictures can be released from the Pre-Assignment Buffer - if ((encodeContextPtr->preAssignmentBufferIntraCount > 0) || - (encodeContextPtr->preAssignmentBufferCount == (EB_U32) (1 << sequenceControlSetPtr->staticConfig.hierarchicalLevels)) || - (encodeContextPtr->preAssignmentBufferEosFlag == EB_TRUE) || - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) || - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B)) - { - - // Initialize Picture Block Params - contextPtr->miniGopStartIndex[0] = 0; - contextPtr->miniGopEndIndex [0] = encodeContextPtr->preAssignmentBufferCount - 1; - contextPtr->miniGopLenght [0] = encodeContextPtr->preAssignmentBufferCount; - - contextPtr->miniGopHierarchicalLevels[0] = sequenceControlSetPtr->staticConfig.hierarchicalLevels; - contextPtr->miniGopIntraCount[0] = encodeContextPtr->preAssignmentBufferIntraCount; - contextPtr->miniGopIdrCount [0] = encodeContextPtr->preAssignmentBufferIdrCount; - contextPtr->totalNumberOfMiniGops = 1; - - encodeContextPtr->previousMiniGopHierarchicalLevels = (pictureControlSetPtr->pictureNumber == 0) ? - sequenceControlSetPtr->staticConfig.hierarchicalLevels : - encodeContextPtr->previousMiniGopHierarchicalLevels; - - GenerateMiniGopRps( - contextPtr, - encodeContextPtr); - - // Loop over Mini GOPs - - for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { - - preAssignmentBufferFirstPassFlag = EB_TRUE; - - // 1st Loop over Pictures in the Pre-Assignment Buffer - for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { - - pictureControlSetPtr = (PictureParentControlSet_t*)encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - // Keep track of the mini GOP size to which the input picture belongs - needed @ PictureManagerProcess() - pictureControlSetPtr->preAssignmentBufferCount = contextPtr->miniGopLenght[miniGopIndex]; - - // Update the Pred Structure if cutting short a Random Access period - if ((contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod || contextPtr->miniGopIdrCount[miniGopIndex] > 0) && - - pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS && - pictureControlSetPtr->idrFlag == EB_FALSE && - pictureControlSetPtr->craFlag == EB_FALSE) - { - // Correct the Pred Index before switching structures - if (preAssignmentBufferFirstPassFlag == EB_TRUE) { - encodeContextPtr->predStructPosition -= pictureControlSetPtr->predStructPtr->initPicIndex; - } - - pictureControlSetPtr->predStructPtr = GetPredictionStructure( - encodeContextPtr->predictionStructureGroupPtr, - EB_PRED_LOW_DELAY_P, - 1, - pictureControlSetPtr->hierarchicalLevels); - - // Set the RPS Override Flag - this current only will convert a Random Access structure to a Low Delay structure - pictureControlSetPtr->useRpsInSps = EB_FALSE; - pictureControlSetPtr->openGopCraFlag = EB_FALSE; - - pictureType = EB_P_PICTURE; - - } - // Open GOP CRA - adjust the RPS - else if ((contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod) && - - (pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS || pictureControlSetPtr->predStructPtr->temporalLayerCount == 1) && - pictureControlSetPtr->idrFlag == EB_FALSE && - pictureControlSetPtr->craFlag == EB_TRUE) - { - pictureControlSetPtr->useRpsInSps = EB_FALSE; - pictureControlSetPtr->openGopCraFlag = EB_TRUE; - - pictureType = EB_I_PICTURE; - } - else { - - pictureControlSetPtr->useRpsInSps = EB_FALSE; - pictureControlSetPtr->openGopCraFlag = EB_FALSE; - - // Set the Picture Type - pictureType = - (pictureControlSetPtr->idrFlag) ? EB_I_PICTURE : - (pictureControlSetPtr->craFlag) ? EB_I_PICTURE : - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) ? EB_P_PICTURE : - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B) ? EB_B_PICTURE : - (pictureControlSetPtr->preAssignmentBufferCount == pictureControlSetPtr->predStructPtr->predStructPeriod) ? ((pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex] && sequenceControlSetPtr->staticConfig.baseLayerSwitchMode) ? EB_P_PICTURE : EB_B_PICTURE) : - - (encodeContextPtr->preAssignmentBufferEosFlag) ? EB_P_PICTURE : - EB_B_PICTURE; - } - - // If Intra, reset position - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; - } - - else if (pictureControlSetPtr->craFlag == EB_TRUE && contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod) { - - encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; - } - else if (encodeContextPtr->elapsedNonCraCount == 0) { - // If we are the picture directly after a CRA, we have to not use references that violate the CRA - encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + 1; - } - // Elif Scene Change, determine leading and trailing pictures - //else if (encodeContextPtr->preAssignmentBufferSceneChangeCount > 0) { - // if(bufferIndex < encodeContextPtr->preAssignmentBufferSceneChangeIndex) { - // ++encodeContextPtr->predStructPosition; - // pictureType = EB_P_PICTURE; - // } - // else { - // encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + encodeContextPtr->preAssignmentBufferCount - bufferIndex - 1; - // } - //} - // Else, Increment the position normally - else { - ++encodeContextPtr->predStructPosition; - } - - // The poc number of the latest IDR picture is stored so that lastIdrPicture (present in PCS) for the incoming pictures can be updated. - // The lastIdrPicture is used in reseting the poc (in entropy coding) whenever IDR is encountered. - // Note IMP: This logic only works when display and decode order are the same. Currently for Random Access, IDR is inserted (similar to CRA) by using trailing P pictures (low delay fashion) and breaking prediction structure. - // Note: When leading P pictures are implemented, this logic has to change.. - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - encodeContextPtr->lastIdrPicture = pictureControlSetPtr->pictureNumber; - } - else { - pictureControlSetPtr->lastIdrPicture = encodeContextPtr->lastIdrPicture; - } - - - // Cycle the PredStructPosition if its overflowed - encodeContextPtr->predStructPosition = (encodeContextPtr->predStructPosition == pictureControlSetPtr->predStructPtr->predStructEntryCount) ? - encodeContextPtr->predStructPosition - pictureControlSetPtr->predStructPtr->predStructPeriod : - encodeContextPtr->predStructPosition; - - predPositionPtr = pictureControlSetPtr->predStructPtr->predStructEntryPtrArray[encodeContextPtr->predStructPosition]; - - // Set the NAL Unit - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_IDR_W_RADL; - } - else if (pictureControlSetPtr->craFlag == EB_TRUE) { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_CRA; - } - // User specify of use of non-reference picture is OFF - else { - // If we have an open GOP situation, where pictures are forward-referencing to a CRA, then those pictures have to be tagged as RASL. - if ((contextPtr->miniGopIntraCount[miniGopIndex] > 0) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && - (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) { - - if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_N; - } - else { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_R; - } - } - else if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_N; - } - else { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_R; - } - } - - // Set the Slice type - pictureControlSetPtr->sliceType = pictureType; - ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->sliceType = pictureControlSetPtr->sliceType; - - - - switch (pictureType) { - - case EB_I_PICTURE: - - // Reset Prediction Structure Position & Reference Struct Position - if (pictureControlSetPtr->pictureNumber == 0){ - encodeContextPtr->intraPeriodPosition = 0; - } - encodeContextPtr->elapsedNonCraCount = 0; - - //------------------------------- - // IDR - //------------------------------- - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - - // Set CRA flag - pictureControlSetPtr->craFlag = EB_FALSE; - - // Reset the pictures since last IDR counter - encodeContextPtr->elapsedNonIdrCount = 0; - - } - //------------------------------- - // CRA - //------------------------------- - else { - - // Set a Random Access Point if not an IDR - pictureControlSetPtr->craFlag = EB_TRUE; - } - - break; - - case EB_P_PICTURE: - case EB_B_PICTURE: - - // Reset CRA and IDR Flag - pictureControlSetPtr->craFlag = EB_FALSE; - pictureControlSetPtr->idrFlag = EB_FALSE; - - // Increment & Clip the elapsed Non-IDR Counter. This is clipped rather than allowed to free-run - // inorder to avoid rollover issues. This assumes that any the GOP period is less than MAX_ELAPSED_IDR_COUNT - encodeContextPtr->elapsedNonIdrCount = MIN(encodeContextPtr->elapsedNonIdrCount + 1, MAX_ELAPSED_IDR_COUNT); - encodeContextPtr->elapsedNonCraCount = MIN(encodeContextPtr->elapsedNonCraCount + 1, MAX_ELAPSED_IDR_COUNT); - - CHECK_REPORT_ERROR( - (pictureControlSetPtr->predStructPtr->predStructEntryCount < MAX_ELAPSED_IDR_COUNT), - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR1); - - break; - - default: - - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR2); + // Determine if Pictures can be released from the Pre-Assignment Buffer + if ((encodeContextPtr->preAssignmentBufferIntraCount > 0) || + (encodeContextPtr->preAssignmentBufferCount == (EB_U32) (1 << sequenceControlSetPtr->staticConfig.hierarchicalLevels)) || + (encodeContextPtr->preAssignmentBufferEosFlag == EB_TRUE) || + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) || + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B)) + { + + // Initialize Picture Block Params + contextPtr->miniGopStartIndex[0] = 0; + contextPtr->miniGopEndIndex [0] = encodeContextPtr->preAssignmentBufferCount - 1; + contextPtr->miniGopLenght [0] = encodeContextPtr->preAssignmentBufferCount; + + contextPtr->miniGopHierarchicalLevels[0] = sequenceControlSetPtr->staticConfig.hierarchicalLevels; + contextPtr->miniGopIntraCount[0] = encodeContextPtr->preAssignmentBufferIntraCount; + contextPtr->miniGopIdrCount [0] = encodeContextPtr->preAssignmentBufferIdrCount; + contextPtr->totalNumberOfMiniGops = 1; + + encodeContextPtr->previousMiniGopHierarchicalLevels = (pictureControlSetPtr->pictureNumber == 0) ? + sequenceControlSetPtr->staticConfig.hierarchicalLevels : + encodeContextPtr->previousMiniGopHierarchicalLevels; + + GenerateMiniGopRps( + contextPtr, + encodeContextPtr); - break; - } - pictureControlSetPtr->predStructIndex = (EB_U8)encodeContextPtr->predStructPosition; - pictureControlSetPtr->temporalLayerIndex = (EB_U8)predPositionPtr->temporalLayerIndex; - pictureControlSetPtr->isUsedAsReferenceFlag = predPositionPtr->isReferenced; + // Loop over Mini GOPs + + for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { + + preAssignmentBufferFirstPassFlag = EB_TRUE; + + // 1st Loop over Pictures in the Pre-Assignment Buffer + for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { + + pictureControlSetPtr = (PictureParentControlSet_t*)encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + // Keep track of the mini GOP size to which the input picture belongs - needed @ PictureManagerProcess() + pictureControlSetPtr->preAssignmentBufferCount = contextPtr->miniGopLenght[miniGopIndex]; + + // Update the Pred Structure if cutting short a Random Access period + if ((contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod || contextPtr->miniGopIdrCount[miniGopIndex] > 0) && + + pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS && + pictureControlSetPtr->idrFlag == EB_FALSE && + pictureControlSetPtr->craFlag == EB_FALSE) + { + // Correct the Pred Index before switching structures + if (preAssignmentBufferFirstPassFlag == EB_TRUE) { + encodeContextPtr->predStructPosition -= pictureControlSetPtr->predStructPtr->initPicIndex; + } + + pictureControlSetPtr->predStructPtr = GetPredictionStructure( + encodeContextPtr->predictionStructureGroupPtr, + EB_PRED_LOW_DELAY_P, + 1, + pictureControlSetPtr->hierarchicalLevels); + + // Set the RPS Override Flag - this current only will convert a Random Access structure to a Low Delay structure + pictureControlSetPtr->useRpsInSps = EB_FALSE; + pictureControlSetPtr->openGopCraFlag = EB_FALSE; + + pictureType = EB_P_PICTURE; + + } + // Open GOP CRA - adjust the RPS + else if ((contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod) && + + (pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS || pictureControlSetPtr->predStructPtr->temporalLayerCount == 1) && + pictureControlSetPtr->idrFlag == EB_FALSE && + pictureControlSetPtr->craFlag == EB_TRUE) + { + pictureControlSetPtr->useRpsInSps = EB_FALSE; + pictureControlSetPtr->openGopCraFlag = EB_TRUE; + + pictureType = EB_I_PICTURE; + } + else { + + pictureControlSetPtr->useRpsInSps = EB_FALSE; + pictureControlSetPtr->openGopCraFlag = EB_FALSE; + + // Set the Picture Type + pictureType = + (pictureControlSetPtr->idrFlag) ? EB_I_PICTURE : + (pictureControlSetPtr->craFlag) ? EB_I_PICTURE : + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) ? EB_P_PICTURE : + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B) ? EB_B_PICTURE : + (pictureControlSetPtr->preAssignmentBufferCount == pictureControlSetPtr->predStructPtr->predStructPeriod) ? ((pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex] && sequenceControlSetPtr->staticConfig.baseLayerSwitchMode) ? EB_P_PICTURE : EB_B_PICTURE) : + + (encodeContextPtr->preAssignmentBufferEosFlag) ? EB_P_PICTURE : + EB_B_PICTURE; + } + + // If Intra, reset position + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; + } + + else if (pictureControlSetPtr->craFlag == EB_TRUE && contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod) { + + encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; + } + else if (encodeContextPtr->elapsedNonCraCount == 0) { + // If we are the picture directly after a CRA, we have to not use references that violate the CRA + encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + 1; + } + // Elif Scene Change, determine leading and trailing pictures + //else if (encodeContextPtr->preAssignmentBufferSceneChangeCount > 0) { + // if(bufferIndex < encodeContextPtr->preAssignmentBufferSceneChangeIndex) { + // ++encodeContextPtr->predStructPosition; + // pictureType = EB_P_PICTURE; + // } + // else { + // encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + encodeContextPtr->preAssignmentBufferCount - bufferIndex - 1; + // } + //} + // Else, Increment the position normally + else { + ++encodeContextPtr->predStructPosition; + } + + // The poc number of the latest IDR picture is stored so that lastIdrPicture (present in PCS) for the incoming pictures can be updated. + // The lastIdrPicture is used in reseting the poc (in entropy coding) whenever IDR is encountered. + // Note IMP: This logic only works when display and decode order are the same. Currently for Random Access, IDR is inserted (similar to CRA) by using trailing P pictures (low delay fashion) and breaking prediction structure. + // Note: When leading P pictures are implemented, this logic has to change.. + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + encodeContextPtr->lastIdrPicture = pictureControlSetPtr->pictureNumber; + } + else { + pictureControlSetPtr->lastIdrPicture = encodeContextPtr->lastIdrPicture; + } + + + // Cycle the PredStructPosition if its overflowed + encodeContextPtr->predStructPosition = (encodeContextPtr->predStructPosition == pictureControlSetPtr->predStructPtr->predStructEntryCount) ? + encodeContextPtr->predStructPosition - pictureControlSetPtr->predStructPtr->predStructPeriod : + encodeContextPtr->predStructPosition; + + predPositionPtr = pictureControlSetPtr->predStructPtr->predStructEntryPtrArray[encodeContextPtr->predStructPosition]; + + // Set the NAL Unit + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_IDR_W_RADL; + } + else if (pictureControlSetPtr->craFlag == EB_TRUE) { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_CRA; + } + // User specify of use of non-reference picture is OFF + else { + // If we have an open GOP situation, where pictures are forward-referencing to a CRA, then those pictures have to be tagged as RASL. + if ((contextPtr->miniGopIntraCount[miniGopIndex] > 0) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && + (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) { + + if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_N; + } + else { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_R; + } + } + else if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_N; + } + else { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_R; + } + } + + // Set the Slice type + pictureControlSetPtr->sliceType = pictureType; + ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->sliceType = pictureControlSetPtr->sliceType; + + + + switch (pictureType) { + + case EB_I_PICTURE: + + // Reset Prediction Structure Position & Reference Struct Position + if (pictureControlSetPtr->pictureNumber == 0){ + encodeContextPtr->intraPeriodPosition = 0; + } + encodeContextPtr->elapsedNonCraCount = 0; + + //------------------------------- + // IDR + //------------------------------- + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + + // Set CRA flag + pictureControlSetPtr->craFlag = EB_FALSE; + + // Reset the pictures since last IDR counter + encodeContextPtr->elapsedNonIdrCount = 0; + + } + //------------------------------- + // CRA + //------------------------------- + else { + + // Set a Random Access Point if not an IDR + pictureControlSetPtr->craFlag = EB_TRUE; + } + + break; + + case EB_P_PICTURE: + case EB_B_PICTURE: + + // Reset CRA and IDR Flag + pictureControlSetPtr->craFlag = EB_FALSE; + pictureControlSetPtr->idrFlag = EB_FALSE; + + // Increment & Clip the elapsed Non-IDR Counter. This is clipped rather than allowed to free-run + // inorder to avoid rollover issues. This assumes that any the GOP period is less than MAX_ELAPSED_IDR_COUNT + encodeContextPtr->elapsedNonIdrCount = MIN(encodeContextPtr->elapsedNonIdrCount + 1, MAX_ELAPSED_IDR_COUNT); + encodeContextPtr->elapsedNonCraCount = MIN(encodeContextPtr->elapsedNonCraCount + 1, MAX_ELAPSED_IDR_COUNT); + + CHECK_REPORT_ERROR( + (pictureControlSetPtr->predStructPtr->predStructEntryCount < MAX_ELAPSED_IDR_COUNT), + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR1); + + break; + + default: + + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR2); + + break; + } + pictureControlSetPtr->predStructIndex = (EB_U8)encodeContextPtr->predStructPosition; + pictureControlSetPtr->temporalLayerIndex = (EB_U8)predPositionPtr->temporalLayerIndex; + pictureControlSetPtr->isUsedAsReferenceFlag = predPositionPtr->isReferenced; pictureControlSetPtr->disableTmvpFlag = sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0 ? EB_TRUE : EB_FALSE; @@ -1028,9 +1028,9 @@ void* PictureDecisionKernel(void *inputPtr) pictureControlSetPtr); // Set the Decode Order - if ((sequenceControlSetPtr->staticConfig.predStructure == EB_PRED_RANDOM_ACCESS) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && + if ((sequenceControlSetPtr->staticConfig.predStructure == EB_PRED_RANDOM_ACCESS) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && - (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) + (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) { pictureControlSetPtr->decodeOrder = encodeContextPtr->decodeBaseNumber + predPositionPtr->decodeOrder; @@ -1040,18 +1040,18 @@ void* PictureDecisionKernel(void *inputPtr) } EbBlockOnMutex(encodeContextPtr->terminatingConditionsMutex); - encodeContextPtr->terminatingSequenceFlagReceived = (pictureControlSetPtr->endOfSequenceFlag == EB_TRUE) ? - EB_TRUE : + encodeContextPtr->terminatingSequenceFlagReceived = (pictureControlSetPtr->endOfSequenceFlag == EB_TRUE) ? + EB_TRUE : encodeContextPtr->terminatingSequenceFlagReceived; - encodeContextPtr->terminatingPictureNumber = (pictureControlSetPtr->endOfSequenceFlag == EB_TRUE) ? + encodeContextPtr->terminatingPictureNumber = (pictureControlSetPtr->endOfSequenceFlag == EB_TRUE) ? pictureControlSetPtr->pictureNumber : encodeContextPtr->terminatingPictureNumber; EbReleaseMutex(encodeContextPtr->terminatingConditionsMutex); preAssignmentBufferFirstPassFlag = EB_FALSE; - + // Update the Dependant List Count - If there was an I-frame or Scene Change, then cleanup the Picture Decision PA Reference Queue Dependent Counts if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { @@ -1059,25 +1059,25 @@ void* PictureDecisionKernel(void *inputPtr) inputQueueIndex = encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex; while(inputQueueIndex != encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex) { - + inputEntryPtr = encodeContextPtr->pictureDecisionPaReferenceQueue[inputQueueIndex]; - + // Modify Dependent List0 depListCount = inputEntryPtr->list0.listCount; for(depIdx=0; depIdx < depListCount; ++depIdx) { - - // Adjust the latest currentInputPoc in case we're in a POC rollover scenario + + // Adjust the latest currentInputPoc in case we're in a POC rollover scenario // currentInputPoc += (currentInputPoc < inputEntryPtr->pocNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; - + depPoc = POC_CIRCULAR_ADD( inputEntryPtr->pictureNumber, // can't use a value that gets reset inputEntryPtr->list0.list[depIdx]/*, sequenceControlSetPtr->bitsForPictureOrderCount*/); - + // If Dependent POC is greater or equal to the IDR POC if(depPoc >= pictureControlSetPtr->pictureNumber && inputEntryPtr->list0.list[depIdx]) { - + inputEntryPtr->list0.list[depIdx] = 0; // Decrement the Reference's referenceCount @@ -1085,23 +1085,23 @@ void* PictureDecisionKernel(void *inputPtr) CHECK_REPORT_ERROR( (inputEntryPtr->dependentCount != ~0u), - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR3); + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR3); } } - + // Modify Dependent List1 depListCount = inputEntryPtr->list1.listCount; for(depIdx=0; depIdx < depListCount; ++depIdx) { - - // Adjust the latest currentInputPoc in case we're in a POC rollover scenario + + // Adjust the latest currentInputPoc in case we're in a POC rollover scenario // currentInputPoc += (currentInputPoc < inputEntryPtr->pocNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; - + depPoc = POC_CIRCULAR_ADD( inputEntryPtr->pictureNumber, inputEntryPtr->list1.list[depIdx]/*, sequenceControlSetPtr->bitsForPictureOrderCount*/); - + // If Dependent POC is greater or equal to the IDR POC if(((depPoc >= pictureControlSetPtr->pictureNumber) || (((pictureControlSetPtr->preAssignmentBufferCount != pictureControlSetPtr->predStructPtr->predStructPeriod) || (pictureControlSetPtr->idrFlag == EB_TRUE)) && (depPoc > (pictureControlSetPtr->pictureNumber - pictureControlSetPtr->preAssignmentBufferCount)))) && inputEntryPtr->list1.list[depIdx]) { inputEntryPtr->list1.list[depIdx] = 0; @@ -1111,18 +1111,18 @@ void* PictureDecisionKernel(void *inputPtr) CHECK_REPORT_ERROR( (inputEntryPtr->dependentCount != ~0u), - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR3); + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR3); } - - } - + + } + // Increment the inputQueueIndex Iterator inputQueueIndex = (inputQueueIndex == PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; - } - + } + } else if(pictureControlSetPtr->idrFlag == EB_TRUE) { - + // Set the Picture Decision PA Reference Entry pointer inputEntryPtr = (PaReferenceQueueEntry_t*) EB_NULL; } @@ -1132,25 +1132,25 @@ void* PictureDecisionKernel(void *inputPtr) inputEntryPtr->inputObjectPtr = pictureControlSetPtr->paReferencePictureWrapperPtr; inputEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; inputEntryPtr->referenceEntryIndex = encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex; - inputEntryPtr->pPcsPtr = pictureControlSetPtr; - encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex = + inputEntryPtr->pPcsPtr = pictureControlSetPtr; + encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex = (encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex == PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex + 1; - + // Check if the Picture Decision PA Reference is full CHECK_REPORT_ERROR( (((encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex != encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex) || (encodeContextPtr->pictureDecisionPaReferenceQueue[encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex]->inputObjectPtr == EB_NULL))), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_PD_ERROR4); - // Copy the reference lists into the inputEntry and + // Copy the reference lists into the inputEntry and // set the Reference Counts Based on Temporal Layer and how many frames are active pictureControlSetPtr->refList0Count = (pictureType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList0.referenceListCount; pictureControlSetPtr->refList1Count = (pictureType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList1.referenceListCount; - inputEntryPtr->list0Ptr = &predPositionPtr->refList0; + inputEntryPtr->list0Ptr = &predPositionPtr->refList0; inputEntryPtr->list1Ptr = &predPositionPtr->refList1; - + { // Copy the Dependent Lists @@ -1173,79 +1173,79 @@ void* PictureDecisionKernel(void *inputPtr) } - ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount = inputEntryPtr->dependentCount; - - /* EB_U32 depCnt = ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount; - if (pictureControlSetPtr->pictureNumber>0 && pictureControlSetPtr->sliceType==EB_I_PICTURE && depCnt!=8 ) - SVT_LOG("depCnt Error1 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0 && depCnt!=8) - SVT_LOG("depCnt Error2 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 1 && depCnt!=4) - SVT_LOG("depCnt Error3 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 2 && depCnt!=2) - SVT_LOG("depCnt Error4 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 3 && depCnt!=0) - SVT_LOG("depCnt Error5 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount);*/ - //if (pictureControlSetPtr->sliceType==EB_P_PICTURE ) - // SVT_LOG("POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount = inputEntryPtr->dependentCount; + + /* EB_U32 depCnt = ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount; + if (pictureControlSetPtr->pictureNumber>0 && pictureControlSetPtr->sliceType==EB_I_PICTURE && depCnt!=8 ) + SVT_LOG("depCnt Error1 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0 && depCnt!=8) + SVT_LOG("depCnt Error2 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 1 && depCnt!=4) + SVT_LOG("depCnt Error3 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 2 && depCnt!=2) + SVT_LOG("depCnt Error4 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 3 && depCnt!=0) + SVT_LOG("depCnt Error5 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount);*/ + //if (pictureControlSetPtr->sliceType==EB_P_PICTURE ) + // SVT_LOG("POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); CHECK_REPORT_ERROR( (pictureControlSetPtr->predStructPtr->predStructPeriod < MAX_ELAPSED_IDR_COUNT), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_PD_ERROR5); // Reset the PA Reference Lists - EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); - - EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EB_U32)); - + EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); + + EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EB_U32)); + } - + // 2nd Loop over Pictures in the Pre-Assignment Buffer - for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { - - pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; + for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { + + pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; // Find the Reference in the Picture Decision PA Reference Queue inputQueueIndex = encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex; do { - + // Setup the Picture Decision PA Reference Queue Entry inputEntryPtr = encodeContextPtr->pictureDecisionPaReferenceQueue[inputQueueIndex]; - + // Increment the referenceQueueIndex Iterator inputQueueIndex = (inputQueueIndex == PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; - + } while ((inputQueueIndex != encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex) && (inputEntryPtr->pictureNumber != pictureControlSetPtr->pictureNumber)); CHECK_REPORT_ERROR( (inputEntryPtr->pictureNumber == pictureControlSetPtr->pictureNumber), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_PD_ERROR7); // Reset the PA Reference Lists - EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); - - EB_MEMSET(pictureControlSetPtr->refPicPocArray, 0, 2 * sizeof(EB_U64)); - + EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); + + EB_MEMSET(pictureControlSetPtr->refPicPocArray, 0, 2 * sizeof(EB_U64)); + // Configure List0 if ((pictureControlSetPtr->sliceType == EB_P_PICTURE) || (pictureControlSetPtr->sliceType == EB_B_PICTURE)) { - - if (pictureControlSetPtr->refList0Count){ + + if (pictureControlSetPtr->refList0Count){ paReferenceQueueIndex = (EB_U32) CIRCULAR_ADD( - ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list0Ptr->referenceList, + ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list0Ptr->referenceList, PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH); // Max - + paReferenceEntryPtr = encodeContextPtr->pictureDecisionPaReferenceQueue[paReferenceQueueIndex]; - + // Calculate the Ref POC refPoc = POC_CIRCULAR_ADD( pictureControlSetPtr->pictureNumber, -inputEntryPtr->list0Ptr->referenceList/*, sequenceControlSetPtr->bitsForPictureOrderCount*/); - + // Set the Reference Object pictureControlSetPtr->refPaPicPtrArray[REF_LIST_0] = paReferenceEntryPtr->inputObjectPtr; pictureControlSetPtr->refPicPocArray[REF_LIST_0] = refPoc; @@ -1261,21 +1261,21 @@ void* PictureDecisionKernel(void *inputPtr) EbObjectIncLiveCount( paReferenceEntryPtr->pPcsPtr->pPcsWrapperPtr, 1); - + --paReferenceEntryPtr->dependentCount; } } - + // Configure List1 if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { - - if (pictureControlSetPtr->refList1Count){ + + if (pictureControlSetPtr->refList1Count){ paReferenceQueueIndex = (EB_U32) CIRCULAR_ADD( - ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list1Ptr->referenceList, + ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list1Ptr->referenceList, PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH); // Max - + paReferenceEntryPtr = encodeContextPtr->pictureDecisionPaReferenceQueue[paReferenceQueueIndex]; - + // Calculate the Ref POC refPoc = POC_CIRCULAR_ADD( pictureControlSetPtr->pictureNumber, @@ -1285,7 +1285,7 @@ void* PictureDecisionKernel(void *inputPtr) // Set the Reference Object pictureControlSetPtr->refPaPicPtrArray[REF_LIST_1] = paReferenceEntryPtr->inputObjectPtr; pictureControlSetPtr->refPicPocArray[REF_LIST_1] = refPoc; - + // Increment the PA Reference's liveCount by the number of tiles in the input picture EbObjectIncLiveCount( paReferenceEntryPtr->inputObjectPtr, @@ -1296,19 +1296,19 @@ void* PictureDecisionKernel(void *inputPtr) EbObjectIncLiveCount( paReferenceEntryPtr->pPcsPtr->pPcsWrapperPtr, 1); - + --paReferenceEntryPtr->dependentCount; } } - + // Initialize Segments pictureControlSetPtr->meSegmentsColumnCount = (EB_U8)(sequenceControlSetPtr->meSegmentColumnCountArray[pictureControlSetPtr->temporalLayerIndex]); pictureControlSetPtr->meSegmentsRowCount = (EB_U8)(sequenceControlSetPtr->meSegmentRowCountArray[pictureControlSetPtr->temporalLayerIndex]); pictureControlSetPtr->meSegmentsTotalCount = (EB_U16)(pictureControlSetPtr->meSegmentsColumnCount * pictureControlSetPtr->meSegmentsRowCount); pictureControlSetPtr->meSegmentsCompletionMask = 0; - // Post the results to the ME processes + // Post the results to the ME processes { EB_U32 segmentIndex; @@ -1321,23 +1321,23 @@ void* PictureDecisionKernel(void *inputPtr) outputResultsPtr = (PictureDecisionResults_t*) outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = encodeContextPtr->preAssignmentBuffer[pictureIndex]; + outputResultsPtr->pictureControlSetWrapperPtr = encodeContextPtr->preAssignmentBuffer[pictureIndex]; + + outputResultsPtr->segmentIndex = segmentIndex; - outputResultsPtr->segmentIndex = segmentIndex; - // Post the Full Results Object EbPostFullObject(outputResultsWrapperPtr); } } - if (pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex]) { + if (pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex]) { - // Increment the Decode Base Number - encodeContextPtr->decodeBaseNumber += contextPtr->miniGopLenght[miniGopIndex]; - } + // Increment the Decode Base Number + encodeContextPtr->decodeBaseNumber += contextPtr->miniGopLenght[miniGopIndex]; + } + + if (pictureIndex == encodeContextPtr->preAssignmentBufferCount - 1) { - if (pictureIndex == encodeContextPtr->preAssignmentBufferCount - 1) { - // Reset the Pre-Assignment Buffer encodeContextPtr->preAssignmentBufferCount = 0; encodeContextPtr->preAssignmentBufferIdrCount = 0; @@ -1350,25 +1350,25 @@ void* PictureDecisionKernel(void *inputPtr) } // End MINI GOPs loop } - + // Walk the pictureDecisionPaReferenceQueue and remove entries that have been completely referenced. inputQueueIndex = encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex; while(inputQueueIndex != encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex) { - + inputEntryPtr = encodeContextPtr->pictureDecisionPaReferenceQueue[inputQueueIndex]; - + // Remove the entry if((inputEntryPtr->dependentCount == 0) && - (inputEntryPtr->inputObjectPtr)) { + (inputEntryPtr->inputObjectPtr)) { EbReleaseObject(inputEntryPtr->pPcsPtr->pPcsWrapperPtr); // Release the nominal liveCount value EbReleaseObject(inputEntryPtr->inputObjectPtr); inputEntryPtr->inputObjectPtr = (EbObjectWrapper_t*) EB_NULL; } - + // Increment the HeadIndex if the head is null - encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex = + encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex = (encodeContextPtr->pictureDecisionPaReferenceQueue[encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex]->inputObjectPtr) ? encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex : (encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex == PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex + 1; @@ -1376,36 +1376,36 @@ void* PictureDecisionKernel(void *inputPtr) CHECK_REPORT_ERROR( (((encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex != encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex) || (encodeContextPtr->pictureDecisionPaReferenceQueue[encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex]->inputObjectPtr == EB_NULL))), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_PD_ERROR4); // Increment the inputQueueIndex Iterator inputQueueIndex = (inputQueueIndex == PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; } - + // Increment the Picture Decision Reordering Queue Head Ptr encodeContextPtr->pictureDecisionReorderQueueHeadIndex = (encodeContextPtr->pictureDecisionReorderQueueHeadIndex == PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->pictureDecisionReorderQueueHeadIndex + 1; - - // Get the next entry from the Picture Decision Reordering Queue (Entry N+1) + + // Get the next entry from the Picture Decision Reordering Queue (Entry N+1) queueEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[encodeContextPtr->pictureDecisionReorderQueueHeadIndex]; } if(windowAvail == EB_FALSE && framePasseThru == EB_FALSE) break; - } + } #if DEADLOCK_DEBUG SVT_LOG("POC %lld PD OUT \n", pictureControlSetPtr->pictureNumber); -#endif +#endif // Release the Input Results EbReleaseObject(inputResultsWrapperPtr); } - + return EB_NULL; } static void UnusedVariablevoidFunc_PicDecision() { (void)NxMSadKernel_funcPtrArray; - (void)NxMSadLoopKernel_funcPtrArray; + (void)NxMSadLoopKernel_funcPtrArray; (void)NxMSadAveragingKernel_funcPtrArray; (void)SadCalculation_8x8_16x16_funcPtrArray; (void)SadCalculation_32x32_64x64_funcPtrArray; diff --git a/Source/Lib/Codec/EbPictureDecisionProcess.h b/Source/Lib/Codec/EbPictureDecisionProcess.h index 93357afc8..d562a2644 100644 --- a/Source/Lib/Codec/EbPictureDecisionProcess.h +++ b/Source/Lib/Codec/EbPictureDecisionProcess.h @@ -17,36 +17,36 @@ extern "C" { * Context **************************************/ typedef struct PictureDecisionContext_s -{ +{ EbFifo_t *pictureAnalysisResultsInputFifoPtr; EbFifo_t *pictureDecisionResultsOutputFifoPtr; - + EB_U64 lastSolidColorFramePoc; - EB_BOOL resetRunningAvg; + EB_BOOL resetRunningAvg; EB_U32 **ahdRunningAvgCb; EB_U32 **ahdRunningAvgCr; EB_U32 **ahdRunningAvg; - EB_BOOL isSceneChangeDetected; + EB_BOOL isSceneChangeDetected; - // Dynamic GOP - EB_U32 totalRegionActivityCost[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; + // Dynamic GOP + EB_U32 totalRegionActivityCost[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; - EB_U32 totalNumberOfMiniGops; + EB_U32 totalNumberOfMiniGops; - EB_U32 miniGopStartIndex[MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopEndIndex [MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopLenght [MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopIntraCount[MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopIdrCount [MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopHierarchicalLevels[MINI_GOP_WINDOW_MAX_COUNT]; - EB_BOOL miniGopActivityArray [MINI_GOP_MAX_COUNT]; - EB_U32 miniGopRegionActivityCostArray[MINI_GOP_MAX_COUNT][MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; + EB_U32 miniGopStartIndex[MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopEndIndex [MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopLenght [MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopIntraCount[MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopIdrCount [MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopHierarchicalLevels[MINI_GOP_WINDOW_MAX_COUNT]; + EB_BOOL miniGopActivityArray [MINI_GOP_MAX_COUNT]; + EB_U32 miniGopRegionActivityCostArray[MINI_GOP_MAX_COUNT][MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; - EB_U32 miniGopGroupFadedInPicturesCount [MINI_GOP_MAX_COUNT]; - EB_U32 miniGopGroupFadedOutPicturesCount[MINI_GOP_MAX_COUNT]; + EB_U32 miniGopGroupFadedInPicturesCount [MINI_GOP_MAX_COUNT]; + EB_U32 miniGopGroupFadedOutPicturesCount[MINI_GOP_MAX_COUNT]; } PictureDecisionContext_t; /*************************************** @@ -56,7 +56,7 @@ extern EB_ERRORTYPE PictureDecisionContextCtor( PictureDecisionContext_t **contextDblPtr, EbFifo_t *pictureAnalysisResultsInputFifoPtr, EbFifo_t *pictureDecisionResultsOutputFifoPtr); - + extern void* PictureDecisionKernel(void *inputPtr); diff --git a/Source/Lib/Codec/EbPictureDecisionQueue.c b/Source/Lib/Codec/EbPictureDecisionQueue.c index 099da8e00..12cfa749d 100644 --- a/Source/Lib/Codec/EbPictureDecisionQueue.c +++ b/Source/Lib/Codec/EbPictureDecisionQueue.c @@ -7,7 +7,7 @@ #include "EbPictureDecisionQueue.h" -EB_ERRORTYPE PaReferenceQueueEntryCtor( +EB_ERRORTYPE PaReferenceQueueEntryCtor( PaReferenceQueueEntry_t **entryDblPtr) { PaReferenceQueueEntry_t *entryPtr; @@ -21,10 +21,10 @@ EB_ERRORTYPE PaReferenceQueueEntryCtor( entryPtr->list0Ptr = (ReferenceList_t*) EB_NULL; entryPtr->list1Ptr = (ReferenceList_t*) EB_NULL; EB_MALLOC(EB_S32*, entryPtr->list0.list, sizeof(EB_S32) * (1 << MAX_TEMPORAL_LAYERS) , EB_N_PTR); - + EB_MALLOC(EB_S32*, entryPtr->list1.list, sizeof(EB_S32) * (1 << MAX_TEMPORAL_LAYERS) , EB_N_PTR); return EB_ErrorNone; } - + diff --git a/Source/Lib/Codec/EbPictureDecisionQueue.h b/Source/Lib/Codec/EbPictureDecisionQueue.h index c5c391d54..7f948a19f 100644 --- a/Source/Lib/Codec/EbPictureDecisionQueue.h +++ b/Source/Lib/Codec/EbPictureDecisionQueue.h @@ -10,7 +10,7 @@ #include "EbDefinitions.h" #include "EbSystemResourceManager.h" #include "EbPredictionStructure.h" -#include"EbPictureControlSet.h" +#include"EbPictureControlSet.h" #ifdef __cplusplus extern "C" { #endif @@ -24,19 +24,19 @@ typedef struct PaReferenceQueueEntry_s { EB_U32 dependentCount; EB_U32 referenceEntryIndex; ReferenceList_t *list0Ptr; - ReferenceList_t *list1Ptr; + ReferenceList_t *list1Ptr; EB_U32 depList0Count; EB_U32 depList1Count; DependentList_t list0; DependentList_t list1; - PictureParentControlSet_t *pPcsPtr; + PictureParentControlSet_t *pPcsPtr; } PaReferenceQueueEntry_t; -extern EB_ERRORTYPE PaReferenceQueueEntryCtor( +extern EB_ERRORTYPE PaReferenceQueueEntryCtor( PaReferenceQueueEntry_t **entryDblPtr); #ifdef __cplusplus } #endif -#endif // EbPictureDecisionQueue_h \ No newline at end of file +#endif // EbPictureDecisionQueue_h diff --git a/Source/Lib/Codec/EbPictureDecisionReorderQueue.c b/Source/Lib/Codec/EbPictureDecisionReorderQueue.c index 16cc268be..e51bcbcc1 100644 --- a/Source/Lib/Codec/EbPictureDecisionReorderQueue.c +++ b/Source/Lib/Codec/EbPictureDecisionReorderQueue.c @@ -6,7 +6,7 @@ #include #include "EbPictureManagerReorderQueue.h" -EB_ERRORTYPE PictureManagerReorderEntryCtor( +EB_ERRORTYPE PictureManagerReorderEntryCtor( PictureManagerReorderEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -14,6 +14,6 @@ EB_ERRORTYPE PictureManagerReorderEntryCtor( (*entryDblPtr)->pictureNumber = pictureNumber; (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureDecisionReorderQueue.h b/Source/Lib/Codec/EbPictureDecisionReorderQueue.h index 361b5087c..df150e81c 100644 --- a/Source/Lib/Codec/EbPictureDecisionReorderQueue.h +++ b/Source/Lib/Codec/EbPictureDecisionReorderQueue.h @@ -16,11 +16,11 @@ extern "C" { * Packetization Reorder Queue Entry ************************************************/ typedef struct PictureDecisionReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *parentPcsWrapperPtr; -} PictureDecisionReorderEntry_t; +} PictureDecisionReorderEntry_t; -extern EB_ERRORTYPE PictureDecisionReorderEntryCtor( +extern EB_ERRORTYPE PictureDecisionReorderEntryCtor( PictureDecisionReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); diff --git a/Source/Lib/Codec/EbPictureDecisionResults.c b/Source/Lib/Codec/EbPictureDecisionResults.c index f3a608f12..65b21558e 100644 --- a/Source/Lib/Codec/EbPictureDecisionResults.c +++ b/Source/Lib/Codec/EbPictureDecisionResults.c @@ -8,7 +8,7 @@ #include "EbPictureDecisionResults.h" EB_ERRORTYPE PictureDecisionResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureDecisionResults_t *objectPtr; @@ -17,7 +17,7 @@ EB_ERRORTYPE PictureDecisionResultCtor( *objectDblPtr = (EB_PTR) objectPtr; objectInitDataPtr = 0; (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureDecisionResults.h b/Source/Lib/Codec/EbPictureDecisionResults.h index 0bd063f16..f2b85236b 100644 --- a/Source/Lib/Codec/EbPictureDecisionResults.h +++ b/Source/Lib/Codec/EbPictureDecisionResults.h @@ -30,7 +30,7 @@ typedef struct PictureDecisionResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureDecisionResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureDemuxResults.c b/Source/Lib/Codec/EbPictureDemuxResults.c index afe0a8e2a..20f39953b 100644 --- a/Source/Lib/Codec/EbPictureDemuxResults.c +++ b/Source/Lib/Codec/EbPictureDemuxResults.c @@ -7,21 +7,21 @@ #include "EbPictureDemuxResults.h" EB_ERRORTYPE PictureResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureDemuxResults_t *objectPtr; EB_MALLOC(PictureDemuxResults_t*, objectPtr, sizeof(PictureDemuxResults_t), EB_N_PTR); *objectDblPtr = objectPtr; - + objectPtr->pictureType = EB_PIC_INVALID; objectPtr->pictureControlSetWrapperPtr = 0; objectPtr->referencePictureWrapperPtr = 0; objectPtr->pictureNumber = 0; - + (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureDemuxResults.h b/Source/Lib/Codec/EbPictureDemuxResults.h index 82aaa2134..aef4c645f 100644 --- a/Source/Lib/Codec/EbPictureDemuxResults.h +++ b/Source/Lib/Codec/EbPictureDemuxResults.h @@ -27,10 +27,10 @@ typedef enum EB_PIC_TYPE { typedef struct PictureDemuxResults_s { EB_PIC_TYPE pictureType; - + // Only valid for input pictures EbObjectWrapper_t *pictureControlSetWrapperPtr; - + // Only valid for reference pictures EbObjectWrapper_t *referencePictureWrapperPtr; EbObjectWrapper_t *sequenceControlSetWrapperPtr; @@ -47,7 +47,7 @@ typedef struct PictureResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureManagerProcess.h b/Source/Lib/Codec/EbPictureManagerProcess.h index 0ec16eb32..df3f1671f 100644 --- a/Source/Lib/Codec/EbPictureManagerProcess.h +++ b/Source/Lib/Codec/EbPictureManagerProcess.h @@ -15,11 +15,11 @@ extern "C" { * Context ***************************************/ typedef struct PictureManagerContext_s -{ +{ EbFifo_t *pictureInputFifoPtr; EbFifo_t *pictureManagerOutputFifoPtr; EbFifo_t **pictureControlSetFifoPtrArray; - + } PictureManagerContext_t; /*************************************** @@ -28,13 +28,13 @@ typedef struct PictureManagerContext_s extern EB_ERRORTYPE PictureManagerContextCtor( PictureManagerContext_t **contextDblPtr, EbFifo_t *pictureInputFifoPtr, - EbFifo_t *pictureManagerOutputFifoPtr, + EbFifo_t *pictureManagerOutputFifoPtr, EbFifo_t **pictureControlSetFifoPtrArray); - - + + extern void* PictureManagerKernel(void *inputPtr); #ifdef __cplusplus } #endif -#endif // EbPictureManager_h \ No newline at end of file +#endif // EbPictureManager_h diff --git a/Source/Lib/Codec/EbPictureManagerQueue.c b/Source/Lib/Codec/EbPictureManagerQueue.c index addaf9831..109ae41c6 100644 --- a/Source/Lib/Codec/EbPictureManagerQueue.c +++ b/Source/Lib/Codec/EbPictureManagerQueue.c @@ -25,7 +25,7 @@ EB_ERRORTYPE InputQueueEntryCtor( -EB_ERRORTYPE ReferenceQueueEntryCtor( +EB_ERRORTYPE ReferenceQueueEntryCtor( ReferenceQueueEntry_t **entryDblPtr) { ReferenceQueueEntry_t *entryPtr; diff --git a/Source/Lib/Codec/EbPictureManagerQueue.h b/Source/Lib/Codec/EbPictureManagerQueue.h index 922bcaca9..f6231fe37 100644 --- a/Source/Lib/Codec/EbPictureManagerQueue.h +++ b/Source/Lib/Codec/EbPictureManagerQueue.h @@ -19,19 +19,19 @@ extern "C" { * Input Queue Entry ************************************************/ struct ReferenceQueueEntry_s; // empty struct definition - + typedef struct InputQueueEntry_s { EbObjectWrapper_t *inputObjectPtr; EB_U32 dependentCount; - EB_U32 referenceEntryIndex; + EB_U32 referenceEntryIndex; ReferenceList_t *list0Ptr; - ReferenceList_t *list1Ptr; + ReferenceList_t *list1Ptr; EB_U32 useCount; EB_BOOL memoryMgmtLoopDone; EB_BOOL rateControlLoopDone; EB_BOOL encodingHasBegun; -} InputQueueEntry_t; +} InputQueueEntry_t; /************************************************ * Reference Queue Entry @@ -52,25 +52,25 @@ typedef struct ReferenceQueueEntry_s { EB_U64 rcGroupIndex; EB_BOOL feedbackArrived; - -} ReferenceQueueEntry_t; + +} ReferenceQueueEntry_t; /************************************************ * Rate Control Input Queue Entry ************************************************/ - + typedef struct RcInputQueueEntry_s { EB_U64 pictureNumber; EbObjectWrapper_t *inputObjectPtr; - + EB_BOOL isPassed; EB_BOOL releaseEnabled; EB_U64 groupId; EB_U64 gopFirstPoc; EB_U32 gopIndex; - - -} RcInputQueueEntry_t; + + +} RcInputQueueEntry_t; /************************************************ * Rate Control FeedBack Queue Entry @@ -86,19 +86,19 @@ typedef struct RcFeedbackQueueEntry_s { EB_U64 groupId; EB_U64 gopFirstPoc; EB_U32 gopIndex; - -} RcFeedbackQueueEntry_t; -extern EB_ERRORTYPE InputQueueEntryCtor( +} RcFeedbackQueueEntry_t; + +extern EB_ERRORTYPE InputQueueEntryCtor( InputQueueEntry_t **entryDblPtr); - -extern EB_ERRORTYPE ReferenceQueueEntryCtor( + +extern EB_ERRORTYPE ReferenceQueueEntryCtor( ReferenceQueueEntry_t **entryDblPtr); #ifdef __cplusplus } -#endif -#endif // EbPictureManagerQueue_h \ No newline at end of file +#endif +#endif // EbPictureManagerQueue_h diff --git a/Source/Lib/Codec/EbPictureManagerReorderQueue.c b/Source/Lib/Codec/EbPictureManagerReorderQueue.c index e8f8f84de..0d5440eaf 100644 --- a/Source/Lib/Codec/EbPictureManagerReorderQueue.c +++ b/Source/Lib/Codec/EbPictureManagerReorderQueue.c @@ -6,7 +6,7 @@ #include #include "EbPictureDecisionReorderQueue.h" -EB_ERRORTYPE PictureDecisionReorderEntryCtor( +EB_ERRORTYPE PictureDecisionReorderEntryCtor( PictureDecisionReorderEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -14,6 +14,6 @@ EB_ERRORTYPE PictureDecisionReorderEntryCtor( (*entryDblPtr)->pictureNumber = pictureNumber; (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureManagerReorderQueue.h b/Source/Lib/Codec/EbPictureManagerReorderQueue.h index b368898b9..f4d3f5cac 100644 --- a/Source/Lib/Codec/EbPictureManagerReorderQueue.h +++ b/Source/Lib/Codec/EbPictureManagerReorderQueue.h @@ -16,11 +16,11 @@ extern "C" { * Packetization Reorder Queue Entry ************************************************/ typedef struct PictureManagerReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *parentPcsWrapperPtr; -} PictureManagerReorderEntry_t; +} PictureManagerReorderEntry_t; -extern EB_ERRORTYPE PictureManagerReorderEntryCtor( +extern EB_ERRORTYPE PictureManagerReorderEntryCtor( PictureManagerReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); diff --git a/Source/Lib/Codec/EbPictureOperators.c b/Source/Lib/Codec/EbPictureOperators.c index 936739da7..76fa29835 100644 --- a/Source/Lib/Codec/EbPictureOperators.c +++ b/Source/Lib/Codec/EbPictureOperators.c @@ -28,7 +28,7 @@ void PictureAddition( EB_U32 height) { - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][width >> 3]( + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][width >> 3]( predPtr, predStride, residualPtr, @@ -74,7 +74,7 @@ EB_ERRORTYPE PictureCopy8Bit( if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( &(src->bufferCb[srcChromaOriginIndex]), src->strideCb, &(dst->bufferCb[dstChromaOriginIndex]), @@ -85,7 +85,7 @@ EB_ERRORTYPE PictureCopy8Bit( if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( &(src->bufferCr[srcChromaOriginIndex]), src->strideCr, &(dst->bufferCr[dstChromaOriginIndex]), @@ -100,7 +100,7 @@ EB_ERRORTYPE PictureCopy8Bit( /******************************************* * Picture Residue : subsampled version - Computes the residual data + Computes the residual data *******************************************/ void PictureSubSampledResidual( EB_U8 *input, @@ -184,47 +184,47 @@ void PictureResidual16bit( } EB_U64 ComputeNxMSatd8x8Units_U8( - EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr - EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride - EB_U32 width, // input parameter, block width (N) - EB_U32 height, // input parameter, block height (M) - EB_U64 *dcValue) + EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr + EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride + EB_U32 width, // input parameter, block width (N) + EB_U32 height, // input parameter, block height (M) + EB_U64 *dcValue) { - EB_U64 satd = 0; - EB_U32 blockIndexInWidth; - EB_U32 blockIndexInHeight; - EB_SATD_U8_TYPE Compute8x8SatdFunction = Compute8x8Satd_U8_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]; - - for (blockIndexInHeight = 0; blockIndexInHeight < height >> 3; ++blockIndexInHeight) { - for (blockIndexInWidth = 0; blockIndexInWidth < width >> 3; ++blockIndexInWidth) { - satd += Compute8x8SatdFunction(&(src[(blockIndexInWidth << 3) + (blockIndexInHeight << 3) * srcStride]), dcValue, srcStride); - } - } - - return satd; + EB_U64 satd = 0; + EB_U32 blockIndexInWidth; + EB_U32 blockIndexInHeight; + EB_SATD_U8_TYPE Compute8x8SatdFunction = Compute8x8Satd_U8_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]; + + for (blockIndexInHeight = 0; blockIndexInHeight < height >> 3; ++blockIndexInHeight) { + for (blockIndexInWidth = 0; blockIndexInWidth < width >> 3; ++blockIndexInWidth) { + satd += Compute8x8SatdFunction(&(src[(blockIndexInWidth << 3) + (blockIndexInHeight << 3) * srcStride]), dcValue, srcStride); + } + } + + return satd; } EB_U64 ComputeNxMSatd4x4Units_U8( - EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr - EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride - EB_U32 width, // input parameter, block width (N) - EB_U32 height, // input parameter, block height (M) - EB_U64 *dcValue) + EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr + EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride + EB_U32 width, // input parameter, block width (N) + EB_U32 height, // input parameter, block height (M) + EB_U64 *dcValue) { - EB_U64 satd = 0; - EB_U32 blockIndexInWidth; - EB_U32 blockIndexInHeight; + EB_U64 satd = 0; + EB_U32 blockIndexInWidth; + EB_U32 blockIndexInHeight; - for (blockIndexInHeight = 0; blockIndexInHeight < height >> 2; ++blockIndexInHeight) { - for (blockIndexInWidth = 0; blockIndexInWidth < width >> 2; ++blockIndexInWidth) { - satd += Compute4x4Satd_U8(&(src[(blockIndexInWidth << 2) + (blockIndexInHeight << 2) * srcStride]), dcValue, srcStride); + for (blockIndexInHeight = 0; blockIndexInHeight < height >> 2; ++blockIndexInHeight) { + for (blockIndexInWidth = 0; blockIndexInWidth < width >> 2; ++blockIndexInWidth) { + satd += Compute4x4Satd_U8(&(src[(blockIndexInWidth << 2) + (blockIndexInHeight << 2) * srcStride]), dcValue, srcStride); - } - } + } + } - return satd; + return satd; } /******************************************* * returns NxM Sum of Absolute Transformed Differences using Compute4x4Satd @@ -233,7 +233,7 @@ EB_U64 ComputeNxMSatdSadLCU( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U32 width, // input parameter, block width (N) - EB_U32 height) // input parameter, block height (M) + EB_U32 height) // input parameter, block height (M) { EB_U64 satd = 0; EB_U64 dcValue = 0; @@ -333,8 +333,8 @@ EB_ERRORTYPE PictureFullDistortion_R( EB_U64 lumaDistortion[DIST_CALC_TOTAL], EB_U64 cbDistortion[DIST_CALC_TOTAL], EB_U64 crDistortion[DIST_CALC_TOTAL], - EB_U32 *countNonZeroCoeffs, - EB_MODETYPE mode) + EB_U32 *countNonZeroCoeffs, + EB_MODETYPE mode) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -348,25 +348,25 @@ EB_ERRORTYPE PictureFullDistortion_R( // Y if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { - - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[0] != 0][mode == INTRA_MODE][areaSize>>3]( + + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[0] != 0][mode == INTRA_MODE][areaSize>>3]( &(((EB_S16*) coeff->bufferY)[coeffLumaOriginIndex]), coeff->strideY, &(((EB_S16*) reconCoeff->bufferY)[coeffLumaOriginIndex]), - reconCoeff->strideY, + reconCoeff->strideY, lumaDistortion, - areaSize, + areaSize, areaSize); } // Cb if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[1] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( + + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[1] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( &(((EB_S16*) coeff->bufferCb)[coeffChromaOriginIndex]), coeff->strideCb, &(((EB_S16*) reconCoeff->bufferCb)[coeffChromaOriginIndex]), - reconCoeff->strideCb, + reconCoeff->strideCb, cbDistortion, chromaAreaSize, chromaAreaSize); @@ -375,11 +375,11 @@ EB_ERRORTYPE PictureFullDistortion_R( // Cr if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[2] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[2] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( &(((EB_S16*) coeff->bufferCr)[coeffChromaOriginIndex]), coeff->strideCr, &(((EB_S16*) reconCoeff->bufferCr)[coeffChromaOriginIndex]), - reconCoeff->strideCr, + reconCoeff->strideCr, crDistortion, chromaAreaSize, chromaAreaSize); @@ -401,21 +401,21 @@ EB_ERRORTYPE PictureFullDistortionLuma( EB_U32 reconCoeffLumaOriginIndex, EB_U32 areaSize, EB_U64 lumaDistortion[DIST_CALC_TOTAL], - EB_U32 countNonZeroCoeffsY, - EB_MODETYPE mode) + EB_U32 countNonZeroCoeffsY, + EB_MODETYPE mode) { EB_ERRORTYPE return_error = EB_ErrorNone; - + //TODO due to a change in full kernel distortion , ASM has to be updated to not accumulate the input distortion by the output lumaDistortion[0] = 0; lumaDistortion[1] = 0; - + // Y - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffsY != 0][mode == INTRA_MODE][areaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffsY != 0][mode == INTRA_MODE][areaSize >> 3]( &(((EB_S16*) coeff->bufferY)[coeffLumaOriginIndex]), coeff->strideY, &(((EB_S16*) reconCoeff->bufferY)[reconCoeffLumaOriginIndex]), - reconCoeff->strideY, + reconCoeff->strideY, lumaDistortion, areaSize, areaSize); @@ -429,17 +429,17 @@ void extract8Bitdata( EB_U16 *in16BitBuffer, EB_U32 inStride, EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U32 out8Stride, EB_U32 width, EB_U32 height ) { - + UnPack8BIT_funcPtrArray_16Bit[((width & 3) == 0) && ((height & 1)== 0)][!!(ASM_TYPES & PREAVX2_MASK)]( in16BitBuffer, inStride, - out8BitBuffer, - out8Stride, + out8BitBuffer, + out8Stride, width, height); } @@ -449,28 +449,28 @@ void UnpackL0L1Avg( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - + UnPackAvg_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( ref16L0, refL0Stride, ref16L1, refL1Stride, dstPtr, - dstStride, + dstStride, width, height); - - + + } void Extract8BitdataSafeSub( EB_U16 *in16BitBuffer, EB_U32 inStride, EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U32 out8Stride, EB_U32 width, EB_U32 height ) @@ -479,8 +479,8 @@ void Extract8BitdataSafeSub( UnPack8BITSafeSub_funcPtrArray_16Bit[!!(ASM_TYPES & AVX2_MASK)]( in16BitBuffer, inStride, - out8BitBuffer, - out8Stride, + out8BitBuffer, + out8Stride, width, height ); @@ -491,7 +491,7 @@ void UnpackL0L1AvgSafeSub( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { @@ -503,11 +503,11 @@ void UnpackL0L1AvgSafeSub( ref16L1, refL1Stride, dstPtr, - dstStride, + dstStride, width, height); - - + + } void UnPack2D( EB_U16 *in16BitBuffer, @@ -546,7 +546,7 @@ void Pack2D_SRC( EB_U32 height ) { - + Pack2D_funcPtrArray_16Bit_SRC[((width & 3) == 0) && ((height & 1)== 0)][!!(ASM_TYPES & AVX2_MASK)]( in8BitBuffer, in8Stride, @@ -583,48 +583,48 @@ void CompressedPackLcu( void CompressedPackBlk( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U16 *out16BitBuffer, - EB_U32 outStride, - EB_U32 width, - EB_U32 height - ) + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U16 *out16BitBuffer, + EB_U32 outStride, + EB_U32 width, + EB_U32 height + ) { - CompressedPack_funcPtrArray[((width == 64 || width == 32 || width == 16 || width == 8) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( - in8BitBuffer, - in8Stride, - innBitBuffer, - out16BitBuffer, - innStride, - outStride, - width, - height); + CompressedPack_funcPtrArray[((width == 64 || width == 32 || width == 16 || width == 8) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( + in8BitBuffer, + in8Stride, + innBitBuffer, + out16BitBuffer, + innStride, + outStride, + width, + height); } void Conv2bToCPackLcu( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height) + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height) { - Convert_Unpack_CPack_funcPtrArray[((width == 64 || width == 32) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( - innBitBuffer, - innStride, - inCompnBitBuffer, - outStride, - localCache, - width, - height); + Convert_Unpack_CPack_funcPtrArray[((width == 64 || width == 32) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( + innBitBuffer, + innStride, + inCompnBitBuffer, + outStride, + localCache, + width, + height); } @@ -658,7 +658,7 @@ void memcpy16bit( } } - + EB_S32 sumResidual( EB_S16 * inPtr, EB_U32 size, EB_U32 strideIn ) @@ -686,12 +686,12 @@ void memset16bitBlock ( for (i = 0; i < size; i++) memset16bit((EB_U16*)inPtr + i*strideIn, value, size); -} +} void UnusedVariablevoidFunc_PicOper() { (void)NxMSadKernel_funcPtrArray; - (void)NxMSadLoopKernel_funcPtrArray; + (void)NxMSadLoopKernel_funcPtrArray; (void)NxMSadAveragingKernel_funcPtrArray; } diff --git a/Source/Lib/Codec/EbPictureOperators.h b/Source/Lib/Codec/EbPictureOperators.h index aa9eb3725..7201e7016 100644 --- a/Source/Lib/Codec/EbPictureOperators.h +++ b/Source/Lib/Codec/EbPictureOperators.h @@ -74,8 +74,8 @@ EB_ERRORTYPE PictureFullDistortion_R( EB_U64 lumaDistortion[DIST_CALC_TOTAL], EB_U64 cbDistortion[DIST_CALC_TOTAL], EB_U64 crDistortion[DIST_CALC_TOTAL], - EB_U32 *countNonZeroCoeffs, - EB_MODETYPE mode); + EB_U32 *countNonZeroCoeffs, + EB_MODETYPE mode); extern EB_ERRORTYPE PictureFullDistortionLuma( EbPictureBufferDesc_t *coeff, @@ -84,22 +84,22 @@ extern EB_ERRORTYPE PictureFullDistortionLuma( EB_U32 reconCoeffLumaOriginIndex, EB_U32 areaSize, EB_U64 lumaDistortion[DIST_CALC_TOTAL], - EB_U32 countNonZeroCoeffsY, - EB_MODETYPE mode); + EB_U32 countNonZeroCoeffsY, + EB_MODETYPE mode); extern EB_ERRORTYPE PictureFullDistortionChroma( EbPictureBufferDesc_t *coeff, EB_U32 coeffCbOriginIndex, - EB_U32 coeffCrOriginIndex, + EB_U32 coeffCrOriginIndex, EbPictureBufferDesc_t *reconCoeff, EB_U32 reconCoeffCbOriginIndex, - EB_U32 reconCoeffCrOriginIndex, + EB_U32 reconCoeffCrOriginIndex, EB_U32 areaSize, EB_U64 cbDistortion[DIST_CALC_TOTAL], - EB_U64 crDistortion[DIST_CALC_TOTAL], - EB_U32 countNonZeroCoeffsCb, - EB_U32 countNonZeroCoeffsCr, - EB_MODETYPE mode); + EB_U64 crDistortion[DIST_CALC_TOTAL], + EB_U32 countNonZeroCoeffsCb, + EB_U32 countNonZeroCoeffsCr, + EB_MODETYPE mode); extern EB_U64 ComputeNxMSatdSadLCU( EB_U8 *src, // input parameter, source samples Ptr @@ -138,23 +138,23 @@ extern void PictureResidual16bit( EB_U32 areaHeight); void CompressedPackBlk( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U16 *out16BitBuffer, - EB_U32 outStride, - EB_U32 width, - EB_U32 height - ); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U16 *out16BitBuffer, + EB_U32 outStride, + EB_U32 width, + EB_U32 height + ); void Conv2bToCPackLcu( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); void CompressedPackLcu( EB_U8 *in8BitBuffer, @@ -166,30 +166,30 @@ void CompressedPackLcu( EB_U32 width, EB_U32 height); -void Pack2D_SRC( +void Pack2D_SRC( EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U16 *out16BitBuffer, - EB_U32 outStride, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U16 *out16BitBuffer, + EB_U32 outStride, EB_U32 width, EB_U32 height); -void UnPack2D( +void UnPack2D( EB_U16 *in16BitBuffer, - EB_U32 inStride, + EB_U32 inStride, EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U8 *outnBitBuffer, - EB_U32 outnStride, + EB_U32 out8Stride, + EB_U8 *outnBitBuffer, + EB_U32 outnStride, EB_U32 width, EB_U32 height); void extract8Bitdata( EB_U16 *in16BitBuffer, EB_U32 inStride, EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U32 out8Stride, EB_U32 width, EB_U32 height ); @@ -199,14 +199,14 @@ void UnpackL0L1Avg( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height); void Extract8BitdataSafeSub( EB_U16 *in16BitBuffer, EB_U32 inStride, EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U32 out8Stride, EB_U32 width, EB_U32 height ); @@ -216,13 +216,13 @@ void UnpackL0L1AvgSafeSub( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height); void memcpy16bit( EB_U16 * outPtr, - EB_U16 * inPtr, + EB_U16 * inPtr, EB_U64 numOfElements ); void memset16bit( EB_U16 * inPtr, @@ -246,10 +246,10 @@ typedef EB_S32(*EB_SUM_RES)( EB_U32 strideIn ); static EB_SUM_RES FUNC_TABLE SumResidual_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - sumResidual, - // AVX2 - sumResidual8bit_AVX2_INTRIN, + // C_DEFAULT + sumResidual, + // AVX2 + sumResidual8bit_AVX2_INTRIN, }; void memset16bitBlock ( @@ -266,10 +266,10 @@ typedef void(*EB_MEMSET16bitBLK)( EB_S16 value ); static EB_MEMSET16bitBLK FUNC_TABLE memset16bitBlock_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - memset16bitBlock, - // AVX2 - memset16bitBlock_AVX2_INTRIN, + // C_DEFAULT + memset16bitBlock, + // AVX2 + memset16bitBlock_AVX2_INTRIN, }; /*************************************** @@ -345,9 +345,9 @@ typedef EB_U64(*EB_SATD_TYPE)( EB_S16 *diff); typedef EB_U64(*EB_SATD_U8_TYPE)( - EB_U8 *diff, - EB_U64 *dcValue, - EB_U32 srcStride); + EB_U8 *diff, + EB_U64 *dcValue, + EB_U32 srcStride); /*************************************** * Function Tables @@ -367,23 +367,23 @@ static EB_ADDDKERNEL_TYPE FUNC_TABLE AdditionKernel_funcPtrArray[EB_ASM_TYPE_TOT }, // AVX2 { - /*0 4x4 */ PictureAdditionKernel4x4_SSE_INTRIN, - /*1 8x8 */ PictureAdditionKernel8x8_SSE2_INTRIN, - /*2 16x16 */ PictureAdditionKernel16x16_SSE2_INTRIN, + /*0 4x4 */ PictureAdditionKernel4x4_SSE_INTRIN, + /*1 8x8 */ PictureAdditionKernel8x8_SSE2_INTRIN, + /*2 16x16 */ PictureAdditionKernel16x16_SSE2_INTRIN, /*3 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, - /*4 32x32 */ PictureAdditionKernel32x32_SSE2_INTRIN, + /*4 32x32 */ PictureAdditionKernel32x32_SSE2_INTRIN, /*5 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, /*6 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, /*7 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, - /*8 64x64 */ PictureAdditionKernel64x64_SSE2_INTRIN, + /*8 64x64 */ PictureAdditionKernel64x64_SSE2_INTRIN, }, }; static EB_ADDDKERNEL_TYPE_16BIT FUNC_TABLE AdditionKernel_funcPtrArray16bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT PictureAdditionKernel16bit, - // AVX2 - PictureAdditionKernel16bit_SSE2_INTRIN, + // AVX2 + PictureAdditionKernel16bit_SSE2_INTRIN, }; static EB_PICCOPY_TYPE FUNC_TABLE PicCopyKernel_funcPtrArray[EB_ASM_TYPE_TOTAL][9] = { @@ -401,15 +401,15 @@ static EB_PICCOPY_TYPE FUNC_TABLE PicCopyKernel_funcPtrArray[EB_ASM_TYPE_TOTAL][ }, // AVX2 { - /*0 4x4 */ PictureCopyKernel4x4_SSE_INTRIN, - /*1 8x8 */ PictureCopyKernel8x8_SSE2_INTRIN, - /*2 16x16 */ PictureCopyKernel16x16_SSE2_INTRIN, + /*0 4x4 */ PictureCopyKernel4x4_SSE_INTRIN, + /*1 8x8 */ PictureCopyKernel8x8_SSE2_INTRIN, + /*2 16x16 */ PictureCopyKernel16x16_SSE2_INTRIN, /*3 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, - /*4 32x32 */ PictureCopyKernel32x32_SSE2_INTRIN, + /*4 32x32 */ PictureCopyKernel32x32_SSE2_INTRIN, /*5 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, /*6 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, /*7 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, - /*8 64x64 */ PictureCopyKernel64x64_SSE2_INTRIN, + /*8 64x64 */ PictureCopyKernel64x64_SSE2_INTRIN, }, }; @@ -422,39 +422,39 @@ typedef void(*EB_RESDKERNELSUBSAMPLED_TYPE)( EB_S16 *residual, EB_U32 residualStride, EB_U32 areaWidth, - EB_U32 areaHeight , - EB_U8 lastLine + EB_U32 areaHeight , + EB_U8 lastLine ); static EB_RESDKERNELSUBSAMPLED_TYPE FUNC_TABLE ResidualKernelSubSampled_funcPtrArray[EB_ASM_TYPE_TOTAL][9] = { - // C_DEFAULT - { - /*0 4x4 */ ResidualKernelSubSampled, - /*1 8x8 */ ResidualKernelSubSampled, - /*2 16x16 */ ResidualKernelSubSampled, - /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*4 32x32 */ ResidualKernelSubSampled, - /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*8 64x64 */ ResidualKernelSubSampled - }, - // AVX2 - { - /*0 4x4 */ ResidualKernelSubSampled4x4_SSE_INTRIN, - /*1 8x8 */ ResidualKernelSubSampled8x8_SSE2_INTRIN, - /*2 16x16 */ ResidualKernelSubSampled16x16_SSE2_INTRIN, - /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*4 32x32 */ ResidualKernelSubSampled32x32_SSE2_INTRIN, - /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*8 64x64 */ ResidualKernelSubSampled64x64_SSE2_INTRIN, - }, + // C_DEFAULT + { + /*0 4x4 */ ResidualKernelSubSampled, + /*1 8x8 */ ResidualKernelSubSampled, + /*2 16x16 */ ResidualKernelSubSampled, + /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*4 32x32 */ ResidualKernelSubSampled, + /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*8 64x64 */ ResidualKernelSubSampled + }, + // AVX2 + { + /*0 4x4 */ ResidualKernelSubSampled4x4_SSE_INTRIN, + /*1 8x8 */ ResidualKernelSubSampled8x8_SSE2_INTRIN, + /*2 16x16 */ ResidualKernelSubSampled16x16_SSE2_INTRIN, + /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*4 32x32 */ ResidualKernelSubSampled32x32_SSE2_INTRIN, + /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*8 64x64 */ ResidualKernelSubSampled64x64_SSE2_INTRIN, + }, }; static EB_RESDKERNEL_TYPE FUNC_TABLE ResidualKernel_funcPtrArray[EB_ASM_TYPE_TOTAL][9] = { - // C_DEFAULT - { + // C_DEFAULT + { /*0 4x4 */ ResidualKernel, /*1 8x8 */ ResidualKernel, /*2 16x16 */ ResidualKernel, @@ -464,26 +464,26 @@ static EB_RESDKERNEL_TYPE FUNC_TABLE ResidualKernel_funcPtrArray[EB_ASM_TYPE_TOT /*6 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, /*7 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, /*8 64x64 */ ResidualKernel - }, - // AVX2 - { - /*0 4x4 */ ResidualKernel4x4_SSE_INTRIN, - /*1 8x8 */ ResidualKernel8x8_SSE2_INTRIN, - /*2 16x16 */ ResidualKernel16x16_SSE2_INTRIN, - /*3 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*4 32x32 */ ResidualKernel32x32_SSE2_INTRIN, - /*5 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*6 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*7 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*8 64x64 */ ResidualKernel64x64_SSE2_INTRIN, - }, + }, + // AVX2 + { + /*0 4x4 */ ResidualKernel4x4_SSE_INTRIN, + /*1 8x8 */ ResidualKernel8x8_SSE2_INTRIN, + /*2 16x16 */ ResidualKernel16x16_SSE2_INTRIN, + /*3 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*4 32x32 */ ResidualKernel32x32_SSE2_INTRIN, + /*5 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*6 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*7 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*8 64x64 */ ResidualKernel64x64_SSE2_INTRIN, + }, }; static EB_RESDKERNEL_TYPE_16BIT FUNC_TABLE ResidualKernel_funcPtrArray16Bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT ResidualKernel16bit, - // AVX2 + // AVX2 ResidualKernel16bit_SSE2_INTRIN }; @@ -506,7 +506,7 @@ static EB_ZEROCOEFF_TYPE FUNC_TABLE PicZeroOutCoef_funcPtrArray[EB_ASM_TYPE_TOTA }, }; -static EB_FULLDIST_TYPE FUNC_TABLE FullDistortionIntrinsic_funcPtrArray[EB_ASM_TYPE_TOTAL][2][2][9] = { +static EB_FULLDIST_TYPE FUNC_TABLE FullDistortionIntrinsic_funcPtrArray[EB_ASM_TYPE_TOTAL][2][2][9] = { // C_DEFAULT // It was found that the SSE2 intrinsic code is much faster (~2x) than the SSE4.1 code { @@ -559,7 +559,7 @@ static EB_FULLDIST_TYPE FUNC_TABLE FullDistortionIntrinsic_funcPtrArray[EB_ASM_T } } - }, + }, // AVX2 // It was found that the SSE2 intrinsic code is much faster (~2x) than the SSE4.1 code { @@ -611,7 +611,7 @@ static EB_FULLDIST_TYPE FUNC_TABLE FullDistortionIntrinsic_funcPtrArray[EB_ASM_T /*8 64x64 */ FullDistortionKernelIntra16MxN_32bit_BT_SSE2, } } - }, + }, }; static EB_SATD_TYPE FUNC_TABLE Compute8x8Satd_funcPtrArray[EB_ASM_TYPE_TOTAL] = { @@ -622,10 +622,10 @@ static EB_SATD_TYPE FUNC_TABLE Compute8x8Satd_funcPtrArray[EB_ASM_TYPE_TOTAL] = }; static EB_SATD_U8_TYPE FUNC_TABLE Compute8x8Satd_U8_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT Compute8x8Satd_U8, - // ASM_AVX2 - Compute8x8Satd_U8_SSE4 + // ASM_AVX2 + Compute8x8Satd_U8_SSE4 }; typedef EB_U64(*EB_SPATIALFULLDIST_TYPE)( diff --git a/Source/Lib/Codec/EbPredictionStructure.c b/Source/Lib/Codec/EbPredictionStructure.c index ba44ba03d..aa678e51c 100644 --- a/Source/Lib/Codec/EbPredictionStructure.c +++ b/Source/Lib/Codec/EbPredictionStructure.c @@ -74,8 +74,8 @@ static PredictionStructureConfigEntry_t flatPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 1, // GOP Index 0 - Ref List 0 - 1 // GOP Index 0 - Ref List 1 + 1, // GOP Index 0 - Ref List 0 + 1 // GOP Index 0 - Ref List 1 } }; @@ -97,15 +97,15 @@ static PredictionStructureConfigEntry_t twoLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 2, // GOP Index 0 - Ref List 0 - 2 // GOP Index 0 - Ref List 1 + 2, // GOP Index 0 - Ref List 0 + 2 // GOP Index 0 - Ref List 1 }, { 1, // GOP Index 1 - Temporal Layer 1, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 } }; @@ -131,29 +131,29 @@ static PredictionStructureConfigEntry_t threeLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 4, // GOP Index 0 - Ref List 0 - 4 // GOP Index 0 - Ref List 1 + 4, // GOP Index 0 - Ref List 0 + 4 // GOP Index 0 - Ref List 1 }, { 2, // GOP Index 1 - Temporal Layer 2, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 1, // GOP Index 2 - Temporal Layer 1, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 2, // GOP Index 3 - Temporal Layer 3, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 } }; @@ -192,50 +192,50 @@ static PredictionStructureConfigEntry_t fourLevelHierarchicalPredStruct[] = { { 3, // GOP Index 1 - Temporal Layer 3, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 2, // GOP Index 2 - Temporal Layer 2, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 3, // GOP Index 3 - Temporal Layer 4, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 }, { 1, // GOP Index 4 - Temporal Layer 1, // GOP Index 4 - Decode Order - 4, // GOP Index 4 - Ref List 0 - -4 // GOP Index 4 - Ref List 1 + 4, // GOP Index 4 - Ref List 0 + -4 // GOP Index 4 - Ref List 1 }, { 3, // GOP Index 5 - Temporal Layer 6, // GOP Index 5 - Decode Order - 1, // GOP Index 5 - Ref List 0 - -1 // GOP Index 5 - Ref List 1 + 1, // GOP Index 5 - Ref List 0 + -1 // GOP Index 5 - Ref List 1 }, { 2, // GOP Index 6 - Temporal Layer 5, // GOP Index 6 - Decode Order - 2, // GOP Index 6 - Ref List 0 - -2 // GOP Index 6 - Ref List 1 + 2, // GOP Index 6 - Ref List 0 + -2 // GOP Index 6 - Ref List 1 }, { 3, // GOP Index 7 - Temporal Layer 7, // GOP Index 7 - Decode Order - 1, // GOP Index 7 - Ref List 0 - -1 // GOP Index 7 - Ref List 1 + 1, // GOP Index 7 - Ref List 0 + -1 // GOP Index 7 - Ref List 1 } }; @@ -268,113 +268,113 @@ static PredictionStructureConfigEntry_t fiveLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 16, // GOP Index 0 - Ref List 0 - 16 // GOP Index 0 - Ref List 1 + 16, // GOP Index 0 - Ref List 0 + 16 // GOP Index 0 - Ref List 1 }, { 4, // GOP Index 1 - Temporal Layer 4, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 3, // GOP Index 2 - Temporal Layer 3, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 4, // GOP Index 3 - Temporal Layer 5, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 }, { 2, // GOP Index 4 - Temporal Layer 2, // GOP Index 4 - Decode Order - 4, // GOP Index 4 - Ref List 0 - -4 // GOP Index 4 - Ref List 1 + 4, // GOP Index 4 - Ref List 0 + -4 // GOP Index 4 - Ref List 1 }, { 4, // GOP Index 5 - Temporal Layer 7, // GOP Index 5 - Decode Order - 1, // GOP Index 5 - Ref List 0 - -1 // GOP Index 5 - Ref List 1 + 1, // GOP Index 5 - Ref List 0 + -1 // GOP Index 5 - Ref List 1 }, { 3, // GOP Index 6 - Temporal Layer 6, // GOP Index 6 - Decode Order - 2, // GOP Index 6 - Ref List 0 - -2 // GOP Index 6 - Ref List 1 + 2, // GOP Index 6 - Ref List 0 + -2 // GOP Index 6 - Ref List 1 }, { 4, // GOP Index 7 - Temporal Layer 8, // GOP Index 7 - Decode Order - 1, // GOP Index 7 - Ref List 0 - -1 // GOP Index 7 - Ref List 1 + 1, // GOP Index 7 - Ref List 0 + -1 // GOP Index 7 - Ref List 1 }, { 1, // GOP Index 8 - Temporal Layer 1, // GOP Index 8 - Decode Order - 8, // GOP Index 8 - Ref List 0 - -8 // GOP Index 8 - Ref List 1 + 8, // GOP Index 8 - Ref List 0 + -8 // GOP Index 8 - Ref List 1 }, { 4, // GOP Index 9 - Temporal Layer 11, // GOP Index 9 - Decode Order - 1, // GOP Index 9 - Ref List 0 - -1 // GOP Index 9 - Ref List 1 + 1, // GOP Index 9 - Ref List 0 + -1 // GOP Index 9 - Ref List 1 }, { 3, // GOP Index 10 - Temporal Layer 10, // GOP Index 10 - Decode Order - 2, // GOP Index 10 - Ref List 0 - -2 // GOP Index 10 - Ref List 1 + 2, // GOP Index 10 - Ref List 0 + -2 // GOP Index 10 - Ref List 1 }, { 4, // GOP Index 11 - Temporal Layer 12, // GOP Index 11 - Decode Order - 1, // GOP Index 11 - Ref List 0 - -1 // GOP Index 11 - Ref List 1 + 1, // GOP Index 11 - Ref List 0 + -1 // GOP Index 11 - Ref List 1 }, { 2, // GOP Index 12 - Temporal Layer 9, // GOP Index 12 - Decode Order - 4, // GOP Index 12 - Ref List 0 - -4 // GOP Index 12 - Ref List 1 + 4, // GOP Index 12 - Ref List 0 + -4 // GOP Index 12 - Ref List 1 }, { 4, // GOP Index 13 - Temporal Layer 14, // GOP Index 13 - Decode Order - 1, // GOP Index 13 - Ref List 0 - -1 // GOP Index 13 - Ref List 1 + 1, // GOP Index 13 - Ref List 0 + -1 // GOP Index 13 - Ref List 1 }, { 3, // GOP Index 14 - Temporal Layer 13, // GOP Index 14 - Decode Order - 2, // GOP Index 14 - Ref List 0 - -2 // GOP Index 14 - Ref List 1 + 2, // GOP Index 14 - Ref List 0 + -2 // GOP Index 14 - Ref List 1 }, { 4, // GOP Index 15 - Temporal Layer 15, // GOP Index 15 - Decode Order - 1, // GOP Index 15 - Ref List 0 - -1 // GOP Index 15 - Ref List 1 + 1, // GOP Index 15 - Ref List 0 + -1 // GOP Index 15 - Ref List 1 } }; @@ -410,225 +410,225 @@ static PredictionStructureConfigEntry_t sixLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 32, // GOP Index 0 - Ref List 0 - 32 // GOP Index 0 - Ref List 1 + 32, // GOP Index 0 - Ref List 0 + 32 // GOP Index 0 - Ref List 1 }, { 5, // GOP Index 1 - Temporal Layer 5, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 4, // GOP Index 2 - Temporal Layer 4, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 5, // GOP Index 3 - Temporal Layer 6, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 }, { 3, // GOP Index 4 - Temporal Layer 3, // GOP Index 4 - Decode Order - 4, // GOP Index 4 - Ref List 0 - -4 // GOP Index 4 - Ref List 1 + 4, // GOP Index 4 - Ref List 0 + -4 // GOP Index 4 - Ref List 1 }, { 5, // GOP Index 5 - Temporal Layer 8, // GOP Index 5 - Decode Order - 1, // GOP Index 5 - Ref List 0 - -1 // GOP Index 5 - Ref List 1 + 1, // GOP Index 5 - Ref List 0 + -1 // GOP Index 5 - Ref List 1 }, { 4, // GOP Index 6 - Temporal Layer 7, // GOP Index 6 - Decode Order - 2, // GOP Index 6 - Ref List 0 - -2 // GOP Index 6 - Ref List 1 + 2, // GOP Index 6 - Ref List 0 + -2 // GOP Index 6 - Ref List 1 }, { 5, // GOP Index 7 - Temporal Layer 9, // GOP Index 7 - Decode Order - 1, // GOP Index 7 - Ref List 0 - -1 // GOP Index 7 - Ref List 1 + 1, // GOP Index 7 - Ref List 0 + -1 // GOP Index 7 - Ref List 1 }, { 2, // GOP Index 8 - Temporal Layer 2, // GOP Index 8 - Decode Order - 8, // GOP Index 8 - Ref List 0 - -8 // GOP Index 8 - Ref List 1 + 8, // GOP Index 8 - Ref List 0 + -8 // GOP Index 8 - Ref List 1 }, { 5, // GOP Index 9 - Temporal Layer 12, // GOP Index 9 - Decode Order - 1, // GOP Index 9 - Ref List 0 - -1 // GOP Index 9 - Ref List 1 + 1, // GOP Index 9 - Ref List 0 + -1 // GOP Index 9 - Ref List 1 }, { 4, // GOP Index 10 - Temporal Layer 11, // GOP Index 10 - Decode Order - 2, // GOP Index 10 - Ref List 0 - -2 // GOP Index 10 - Ref List 1 + 2, // GOP Index 10 - Ref List 0 + -2 // GOP Index 10 - Ref List 1 }, { 5, // GOP Index 11 - Temporal Layer 13, // GOP Index 11 - Decode Order - 1, // GOP Index 11 - Ref List 0 - -1 // GOP Index 11 - Ref List 1 + 1, // GOP Index 11 - Ref List 0 + -1 // GOP Index 11 - Ref List 1 }, { 3, // GOP Index 12 - Temporal Layer 10, // GOP Index 12 - Decode Order - 4, // GOP Index 12 - Ref List 0 - -4 // GOP Index 12 - Ref List 1 + 4, // GOP Index 12 - Ref List 0 + -4 // GOP Index 12 - Ref List 1 }, { 5, // GOP Index 13 - Temporal Layer 15, // GOP Index 13 - Decode Order - 1, // GOP Index 13 - Ref List 0 - -1 // GOP Index 13 - Ref List 1 + 1, // GOP Index 13 - Ref List 0 + -1 // GOP Index 13 - Ref List 1 }, { 4, // GOP Index 14 - Temporal Layer 14, // GOP Index 14 - Decode Order - 2, // GOP Index 14 - Ref List 0 - -2 // GOP Index 14 - Ref List 1 + 2, // GOP Index 14 - Ref List 0 + -2 // GOP Index 14 - Ref List 1 }, { 5, // GOP Index 15 - Temporal Layer 16, // GOP Index 15 - Decode Order - 1, // GOP Index 15 - Ref List 0 - -1 // GOP Index 15 - Ref List 1 + 1, // GOP Index 15 - Ref List 0 + -1 // GOP Index 15 - Ref List 1 }, { 1, // GOP Index 16 - Temporal Layer 1, // GOP Index 16 - Decode Order - 16, // GOP Index 16 - Ref List 0 - -16 // GOP Index 16 - Ref List 1 + 16, // GOP Index 16 - Ref List 0 + -16 // GOP Index 16 - Ref List 1 }, { 5, // GOP Index 17 - Temporal Layer 20, // GOP Index 17 - Decode Order - 1, // GOP Index 17 - Ref List 0 - -1 // GOP Index 17 - Ref List 1 + 1, // GOP Index 17 - Ref List 0 + -1 // GOP Index 17 - Ref List 1 }, { 4, // GOP Index 18 - Temporal Layer 19, // GOP Index 18 - Decode Order - 2, // GOP Index 18 - Ref List 0 - -2 // GOP Index 18 - Ref List 1 + 2, // GOP Index 18 - Ref List 0 + -2 // GOP Index 18 - Ref List 1 }, { 5, // GOP Index 19 - Temporal Layer 21, // GOP Index 19 - Decode Order - 1, // GOP Index 19 - Ref List 0 - -1 // GOP Index 19 - Ref List 1 + 1, // GOP Index 19 - Ref List 0 + -1 // GOP Index 19 - Ref List 1 }, { 3, // GOP Index 20 - Temporal Layer 18, // GOP Index 20 - Decode Order - 4, // GOP Index 20 - Ref List 0 - -4 // GOP Index 20 - Ref List 1 + 4, // GOP Index 20 - Ref List 0 + -4 // GOP Index 20 - Ref List 1 }, { 5, // GOP Index 21 - Temporal Layer 23, // GOP Index 21 - Decode Order - 1, // GOP Index 21 - Ref List 0 - -1 // GOP Index 21 - Ref List 1 + 1, // GOP Index 21 - Ref List 0 + -1 // GOP Index 21 - Ref List 1 }, { 4, // GOP Index 22 - Temporal Layer 22, // GOP Index 22 - Decode Order - 2, // GOP Index 22 - Ref List 0 - -2 // GOP Index 22 - Ref List 1 + 2, // GOP Index 22 - Ref List 0 + -2 // GOP Index 22 - Ref List 1 }, { 5, // GOP Index 23 - Temporal Layer 24, // GOP Index 23 - Decode Order - 1, // GOP Index 23 - Ref List 0 - -1 // GOP Index 23 - Ref List 1 + 1, // GOP Index 23 - Ref List 0 + -1 // GOP Index 23 - Ref List 1 }, { 2, // GOP Index 24 - Temporal Layer 17, // GOP Index 24 - Decode Order - 8, // GOP Index 24 - Ref List 0 - -8 // GOP Index 24 - Ref List 1 + 8, // GOP Index 24 - Ref List 0 + -8 // GOP Index 24 - Ref List 1 }, { 5, // GOP Index 25 - Temporal Layer 27, // GOP Index 25 - Decode Order - 1, // GOP Index 25 - Ref List 0 - -1 // GOP Index 25 - Ref List 1 + 1, // GOP Index 25 - Ref List 0 + -1 // GOP Index 25 - Ref List 1 }, { 4, // GOP Index 26 - Temporal Layer 26, // GOP Index 26 - Decode Order - 2, // GOP Index 26 - Ref List 0 - -2 // GOP Index 26 - Ref List 1 + 2, // GOP Index 26 - Ref List 0 + -2 // GOP Index 26 - Ref List 1 }, { 5, // GOP Index 27 - Temporal Layer 28, // GOP Index 27 - Decode Order - 1, // GOP Index 27 - Ref List 0 - -1 // GOP Index 27 - Ref List 1 + 1, // GOP Index 27 - Ref List 0 + -1 // GOP Index 27 - Ref List 1 }, { 3, // GOP Index 28 - Temporal Layer 25, // GOP Index 28 - Decode Order - 4, // GOP Index 28 - Ref List 0 - -4 // GOP Index 28 - Ref List 1 + 4, // GOP Index 28 - Ref List 0 + -4 // GOP Index 28 - Ref List 1 }, { 5, // GOP Index 29 - Temporal Layer 30, // GOP Index 29 - Decode Order - 1, // GOP Index 29 - Ref List 0 - -1 // GOP Index 29 - Ref List 1 + 1, // GOP Index 29 - Ref List 0 + -1 // GOP Index 29 - Ref List 1 }, { 4, // GOP Index 30 - Temporal Layer 29, // GOP Index 30 - Decode Order - 2, // GOP Index 30 - Ref List 0 - -2 // GOP Index 30 - Ref List 1 + 2, // GOP Index 30 - Ref List 0 + -2 // GOP Index 30 - Ref List 1 }, { 5, // GOP Index 31 - Temporal Layer 31, // GOP Index 31 - Decode Order - 1, // GOP Index 31 - Ref List 0 - -1 // GOP Index 31 - Ref List 1 + 1, // GOP Index 31 - Ref List 0 + -1 // GOP Index 31 - Ref List 1 } }; @@ -1018,7 +1018,7 @@ static EB_ERRORTYPE PredictionStructureCtor( predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceListCount = refIndex; // Allocate the Leading Picture Reference List 0{ - predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceList = 0; + predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceList = 0; // Copy Reference List 0 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceListCount; ++refIndex) { @@ -1045,7 +1045,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1071,7 +1071,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1145,7 +1145,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1167,7 +1167,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1781,10 +1781,10 @@ EB_ERRORTYPE PredictionStructureGroupCtor( // Count the number of Prediction Structures while((PredictionStructureConfigArray[predStructIndex].entryArray != 0) && (PredictionStructureConfigArray[predStructIndex].entryCount != 0)) { // Get Random Access + P for temporal ID 0 - if(PredictionStructureConfigArray[predStructIndex].entryArray->temporalLayerIndex == 0 && baseLayerSwitchMode) { + if(PredictionStructureConfigArray[predStructIndex].entryArray->temporalLayerIndex == 0 && baseLayerSwitchMode) { PredictionStructureConfigArray[predStructIndex].entryArray->refList1 = 0; } - ++predStructIndex; + ++predStructIndex; } predictionStructureGroupPtr->predictionStructureCount = MAX_TEMPORAL_LAYERS * EB_PRED_TOTAL_COUNT; diff --git a/Source/Lib/Codec/EbPredictionStructure.h b/Source/Lib/Codec/EbPredictionStructure.h index 74d048fc0..ea05cb99b 100644 --- a/Source/Lib/Codec/EbPredictionStructure.h +++ b/Source/Lib/Codec/EbPredictionStructure.h @@ -31,13 +31,13 @@ extern "C" { /************************************************ * Reference List * - * referenceList - Contains the deltaPOCs of + * referenceList - Contains the deltaPOCs of * the pictures referenced by the current * picture. ************************************************/ typedef struct ReferenceList_s { - EB_S32 referenceList; + EB_S32 referenceList; EB_U32 referenceListCount; } ReferenceList_t; @@ -47,25 +47,25 @@ typedef struct ReferenceList_s * * listCount - Contains count of how * deep into list should be used - * depending on how many references are + * depending on how many references are * being used in the prediction structure. * * list - Contains the deltaPOCs of * pictures that reference the current picture. * The dependent list pictures must be grouped - * by the referenceCount group in ascending + * by the referenceCount group in ascending * order. The grouping is not display order! ************************************************/ typedef struct DependentList_s { EB_S32 *list; EB_U32 listCount; - + } DependentList_t; /************************************************ * Prediction Structure Config Entry - * Contains the basic reference lists and + * Contains the basic reference lists and * configurations for each Prediction Structure * Config Entry. ************************************************/ @@ -87,7 +87,7 @@ typedef struct PredictionStructureConfig_s { } PredictionStructureConfig_t; /************************************************ - * Prediction Structure Entry + * Prediction Structure Entry * Contains the reference and dependent lists * for a particular picture in the Prediction * Structure. @@ -135,11 +135,11 @@ typedef struct PredictionStructureEntry_s { EB_S32 refPicsList0TotalCountMinus1; EB_S32 refPicsList1TotalCountMinus1; EB_BOOL listsModificationPresentFlag; - EB_BOOL restrictedRefPicListsFlag; // Same list enable flag (if set, - // it implies all slices of the - // same type in the same picture + EB_BOOL restrictedRefPicListsFlag; // Same list enable flag (if set, + // it implies all slices of the + // same type in the same picture // have identical lists) - + // List Modification // *Note - This should probably be moved to the slice header since its a dynamic control - JMJ Jan 2, 2013 EB_BOOL list0ModificationFlag; @@ -148,7 +148,7 @@ typedef struct PredictionStructureEntry_s { EB_U32 list1ModIndex[MAX_NUM_OF_REF_PICS_TOTAL]; // Lists Combination (STUB) - + } PredictionStructureEntry_t; /************************************************ @@ -169,7 +169,7 @@ typedef struct PredictionStructure_s { EB_U32 leadingPicIndex; EB_U32 initPicIndex; EB_U32 steadyStateIndex; - + // RPS Related Entries EB_BOOL restrictedRefPicListsEnableFlag; EB_BOOL listsModificationEnableFlag; @@ -181,8 +181,8 @@ typedef struct PredictionStructure_s { /************************************************ * Prediction Structure Group - * Contains the control structures for all - * supported prediction structures. + * Contains the control structures for all + * supported prediction structures. ************************************************/ typedef struct PredictionStructureGroup_s { PredictionStructure_t **predictionStructurePtrArray; @@ -200,8 +200,8 @@ extern PredictionStructure_t* GetPredictionStructure( PredictionStructureGroup_t *predictionStructureGroupPtr, EB_PRED predStructure, EB_U32 numberOfReferences, - EB_U32 levelsOfHierarchy); + EB_U32 levelsOfHierarchy); #ifdef __cplusplus } #endif -#endif // EbPredictionStructure_h \ No newline at end of file +#endif // EbPredictionStructure_h diff --git a/Source/Lib/Codec/EbPredictionUnit.h b/Source/Lib/Codec/EbPredictionUnit.h index c424c9b66..25a047209 100644 --- a/Source/Lib/Codec/EbPredictionUnit.h +++ b/Source/Lib/Codec/EbPredictionUnit.h @@ -13,17 +13,17 @@ extern "C" { #endif #pragma pack(push, 1) -typedef struct PredictionUnit_s +typedef struct PredictionUnit_s { - Mv_t mv [MAX_NUM_OF_REF_PIC_LIST]; // 16-bytes + Mv_t mv [MAX_NUM_OF_REF_PIC_LIST]; // 16-bytes Mvd_t mvd[MAX_NUM_OF_REF_PIC_LIST]; // 16-bytes unsigned mergeIndex : 5; - unsigned mergeFlag : 1; - + unsigned mergeFlag : 1; + unsigned interPredDirectionIndex : 2; - unsigned intraLumaMode : 6; - unsigned intraLumaLeftMode : 6; - unsigned intraLumaTopMode : 6; + unsigned intraLumaMode : 6; + unsigned intraLumaLeftMode : 6; + unsigned intraLumaTopMode : 6; } PredictionUnit_t; #pragma pack(pop) @@ -32,4 +32,4 @@ typedef struct PredictionUnit_s #ifdef __cplusplus } #endif -#endif //EbPredictionUnit_h \ No newline at end of file +#endif //EbPredictionUnit_h diff --git a/Source/Lib/Codec/EbProductCodingLoop.c b/Source/Lib/Codec/EbProductCodingLoop.c index 24aa27f43..aec70eb5b 100644 --- a/Source/Lib/Codec/EbProductCodingLoop.c +++ b/Source/Lib/Codec/EbProductCodingLoop.c @@ -27,180 +27,180 @@ EB_U8 MDSCAN_TO_QUADTREE_ID[] = { - 1, - 1, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, - 2, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, - 3, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, - 4, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, + 1, + 1, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, + 2, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, + 3, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, + 4, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, }; EB_U8 CHILD_MDSCAN_TO_PARENT_MDSCAN[] = { - 0, - 0, - 1, - 2, - 2, - 2, - 2, - 1, - 7, - 7, - 7, - 7, - 1, - 12, - 12, - 12, - 12, - 1, - 17, - 17, - 17, - 17, - 0, - 22, - 23, - 23, - 23, - 23, - 22, - 28, - 28, - 28, - 28, - 22, - 33, - 33, - 33, - 33, - 22, - 38, - 38, - 38, - 38, - 0, - 43, - 44, - 44, - 44, - 44, - 43, - 49, - 49, - 49, - 49, - 43, - 54, - 54, - 54, - 54, - 43, - 59, - 59, - 59, - 59, - 0, - 64, - 65, - 65, - 65, - 65, - 64, - 70, - 70, - 70, - 70, - 64, - 75, - 75, - 75, - 75, - 64, - 80, - 80, - 80, - 80, + 0, + 0, + 1, + 2, + 2, + 2, + 2, + 1, + 7, + 7, + 7, + 7, + 1, + 12, + 12, + 12, + 12, + 1, + 17, + 17, + 17, + 17, + 0, + 22, + 23, + 23, + 23, + 23, + 22, + 28, + 28, + 28, + 28, + 22, + 33, + 33, + 33, + 33, + 22, + 38, + 38, + 38, + 38, + 0, + 43, + 44, + 44, + 44, + 44, + 43, + 49, + 49, + 49, + 49, + 43, + 54, + 54, + 54, + 54, + 43, + 59, + 59, + 59, + 59, + 0, + 64, + 65, + 65, + 65, + 65, + 64, + 70, + 70, + 70, + 70, + 64, + 75, + 75, + 75, + 75, + 64, + 80, + 80, + 80, + 80, }; @@ -210,33 +210,33 @@ static const EB_U8 CuOffset[4] = { 85, 21, 5, 1 }; const EB_FULL_COST_FUNC fullCostFuncTable[3][3] = { - /* */{ NULL, NULL, NULL }, - /*INTER */{ InterFullCost, InterFullCost, NULL }, - /*INTRA */{ IntraFullCostPslice, IntraFullCostPslice, IntraFullCostIslice }, + /* */{ NULL, NULL, NULL }, + /*INTER */{ InterFullCost, InterFullCost, NULL }, + /*INTRA */{ IntraFullCostPslice, IntraFullCostPslice, IntraFullCostIslice }, }; const EB_PREDICTION_FUNC PredictionFunTableOl[2][3] = { - { NULL, Inter2Nx2NPuPredictionInterpolationFree, IntraPredictionOl }, // Interpolation-free path + { NULL, Inter2Nx2NPuPredictionInterpolationFree, IntraPredictionOl }, // Interpolation-free path { NULL, Inter2Nx2NPuPredictionHevc, IntraPredictionOl } // HEVC Interpolation path }; const EB_PREDICTION_FUNC PredictionFunTableCl[2][3] = { - { NULL, Inter2Nx2NPuPredictionInterpolationFree , IntraPredictionCl }, // Interpolation-free path + { NULL, Inter2Nx2NPuPredictionInterpolationFree , IntraPredictionCl }, // Interpolation-free path { NULL, Inter2Nx2NPuPredictionHevc, IntraPredictionCl } // HEVC Interpolation path }; const EB_FAST_COST_FUNC ProductFastCostFuncOptTable[3][3] = { - /* */{ NULL, NULL, NULL }, - /*INTER */{ InterFastCostBsliceOpt, InterFastCostPsliceOpt, NULL }, - /*INTRA */{ Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostIsliceOpt }, + /* */{ NULL, NULL, NULL }, + /*INTER */{ InterFastCostBsliceOpt, InterFastCostPsliceOpt, NULL }, + /*INTRA */{ Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostIsliceOpt }, }; const EB_FULL_LUMA_COST_FUNC ProductFullLumaCostFuncTable[3][3] = { - /* */{ NULL, NULL, NULL }, - /*INTER */{ InterFullLumaCost, InterFullLumaCost, NULL }, - /*INTRA */{ IntraFullLumaCostPslice, IntraFullLumaCostPslice, IntraFullLumaCostIslice }, + /* */{ NULL, NULL, NULL }, + /*INTER */{ InterFullLumaCost, InterFullLumaCost, NULL }, + /*INTRA */{ IntraFullLumaCostPslice, IntraFullLumaCostPslice, IntraFullLumaCostIslice }, }; const EB_INTRA_4x4_FAST_LUMA_COST_FUNC Intra4x4FastCostFuncTable[3] = @@ -255,27 +255,27 @@ const EB_INTRA_4x4_FULL_LUMA_COST_FUNC Intra4x4FullCostFuncTable[3] = const EB_INTRA_NxN_FAST_COST_FUNC IntraNxNFastCostFuncTable[3] = { - IntraNxNFastCostPslice, - IntraNxNFastCostPslice, - IntraNxNFastCostIslice + IntraNxNFastCostPslice, + IntraNxNFastCostPslice, + IntraNxNFastCostIslice }; const EB_INTRA_NxN_FULL_COST_FUNC IntraNxNFullCostFuncTable[3] = { - IntraNxNFullCostPslice, - IntraNxNFullCostPslice, - IntraNxNFullCostIslice + IntraNxNFullCostPslice, + IntraNxNFullCostPslice, + IntraNxNFullCostIslice }; extern void GenerateIntraLumaReferenceSamplesMd( - ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr) { + ModeDecisionContext_t *contextPtr, + EbPictureBufferDesc_t *inputPicturePtr) { EB_BOOL pictureLeftBoundary = (contextPtr->lcuPtr->lcuEdgeInfoPtr->tileLeftEdgeFlag == EB_TRUE && ((contextPtr->cuOriginX & (contextPtr->lcuPtr->size - 1)) == 0)) ? EB_TRUE : EB_FALSE; EB_BOOL pictureTopBoundary = (contextPtr->lcuPtr->lcuEdgeInfoPtr->tileTopEdgeFlag == EB_TRUE && ((contextPtr->cuOriginY & (contextPtr->lcuPtr->size - 1)) == 0)) ? EB_TRUE : EB_FALSE; EB_BOOL pictureRightBoundary = (contextPtr->lcuPtr->lcuEdgeInfoPtr->tileRightEdgeFlag == EB_TRUE && (((contextPtr->cuOriginX + contextPtr->cuStats->size) & (contextPtr->lcuPtr->size - 1)) == 0)) ? EB_TRUE : EB_FALSE; - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) { + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) { GenerateLumaIntraReferenceSamplesEncodePass( EB_FALSE, @@ -294,110 +294,110 @@ extern void GenerateIntraLumaReferenceSamplesMd( pictureTopBoundary, pictureRightBoundary); - contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; + contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; - } - else{ - //TODO: Change this function to take care of neighbour validity. - // then create a generic function that takes recon or input frame as generic input for both open and close loop case. - UpdateNeighborSamplesArrayOL( - contextPtr->intraRefPtr, - inputPicturePtr, - inputPicturePtr->strideY, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuStats->size, - contextPtr->lcuPtr); + } + else{ + //TODO: Change this function to take care of neighbour validity. + // then create a generic function that takes recon or input frame as generic input for both open and close loop case. + UpdateNeighborSamplesArrayOL( + contextPtr->intraRefPtr, + inputPicturePtr, + inputPicturePtr->strideY, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuStats->size, + contextPtr->lcuPtr); - contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; + contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; - } + } } void ApplyMvOverBoundariesBias( - SequenceControlSet_t *sequenceControlSetPtr, - ModeDecisionContext_t *contextPtr, - EB_U32 cuSize, - ModeDecisionCandidateBuffer_t *candidateBuffer - ) { - - if (candidateBuffer->candidatePtr->type == INTER_MODE) { - - if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_0) { - if ( - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) - - ){ - *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; - - - } - } - else if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_1) { - if ( - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) - ){ - //*candidateBuffer->fastCostPtr += (*candidateBuffer->fastCostPtr * 100) / 100; - *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; - - } - } - else { - if ( - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) - ){ - *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; - } - } - } + SequenceControlSet_t *sequenceControlSetPtr, + ModeDecisionContext_t *contextPtr, + EB_U32 cuSize, + ModeDecisionCandidateBuffer_t *candidateBuffer + ) { + + if (candidateBuffer->candidatePtr->type == INTER_MODE) { + + if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_0) { + if ( + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) + + ){ + *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; + + + } + } + else if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_1) { + if ( + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) + ){ + //*candidateBuffer->fastCostPtr += (*candidateBuffer->fastCostPtr * 100) / 100; + *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; + + } + } + else { + if ( + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) + ){ + *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; + } + } + } }; /*************************************************** * Update Recon Samples Neighbor Arrays ***************************************************/ void ModeDecisionUpdateNeighborArrays( - NeighborArrayUnit_t *leafDepthNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - NeighborArrayUnit_t *skipNeighborArray, - NeighborArrayUnit_t *lumaReconSampleNeighborArray, - NeighborArrayUnit_t *cbReconSampleNeighborArray, - NeighborArrayUnit_t *crReconSampleNeighborArray, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_BOOL intraMdOpenLoop, + NeighborArrayUnit_t *leafDepthNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + NeighborArrayUnit_t *skipNeighborArray, + NeighborArrayUnit_t *lumaReconSampleNeighborArray, + NeighborArrayUnit_t *cbReconSampleNeighborArray, + NeighborArrayUnit_t *crReconSampleNeighborArray, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_BOOL intraMdOpenLoop, EB_BOOL intra4x4Selected, - EB_U8 *depth, - EB_U8 *modeType, - EB_U8 *lumaMode, - MvUnit_t *mvUnit, - EB_U8 *skipFlag, - EB_U32 originX, - EB_U32 originY, - EB_U32 size, - EB_BOOL useIntraChromaflag) + EB_U8 *depth, + EB_U8 *modeType, + EB_U8 *lumaMode, + MvUnit_t *mvUnit, + EB_U8 *skipFlag, + EB_U32 originX, + EB_U32 originY, + EB_U32 size, + EB_BOOL useIntraChromaflag) { - NeighborArrayUnitDepthSkipWrite( - leafDepthNeighborArray, - (EB_U8*)depth, - originX, - originY, - size); + NeighborArrayUnitDepthSkipWrite( + leafDepthNeighborArray, + (EB_U8*)depth, + originX, + originY, + size); if (intra4x4Selected == EB_FALSE){ NeighborArrayUnitModeTypeWrite( @@ -415,20 +415,20 @@ void ModeDecisionUpdateNeighborArrays( size); } - // *Note - this has to be changed for non-square PU support -- JMJ - NeighborArrayUnitMvWrite( - mvNeighborArray, - (EB_U8*)mvUnit, - originX, - originY, - size); - - NeighborArrayUnitDepthSkipWrite( - skipNeighborArray, - (EB_U8*)skipFlag, - originX, - originY, - size); + // *Note - this has to be changed for non-square PU support -- JMJ + NeighborArrayUnitMvWrite( + mvNeighborArray, + (EB_U8*)mvUnit, + originX, + originY, + size); + + NeighborArrayUnitDepthSkipWrite( + skipNeighborArray, + (EB_U8*)skipFlag, + originX, + originY, + size); if (intraMdOpenLoop == EB_FALSE && intra4x4Selected == EB_FALSE) { // Recon Samples - Luma @@ -474,41 +474,41 @@ void ModeDecisionUpdateNeighborArrays( } - return; + return; } void MvMergePassUpdateNeighborArrays( PictureControlSet_t *pictureControlSetPtr, - NeighborArrayUnit_t *leafDepthNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - NeighborArrayUnit_t *skipNeighborArray, - NeighborArrayUnit_t *lumaReconSampleNeighborArray, - NeighborArrayUnit_t *cbReconSampleNeighborArray, - NeighborArrayUnit_t *crReconSampleNeighborArray, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_BOOL intraMdOpenLoop, - EB_U8 *depth, - EB_U8 *modeType, - EB_U8 *lumaMode, - MvUnit_t *mvUnit, - EB_U8 *skipFlag, - EB_U32 originX, - EB_U32 originY, - EB_U32 size, + NeighborArrayUnit_t *leafDepthNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + NeighborArrayUnit_t *skipNeighborArray, + NeighborArrayUnit_t *lumaReconSampleNeighborArray, + NeighborArrayUnit_t *cbReconSampleNeighborArray, + NeighborArrayUnit_t *crReconSampleNeighborArray, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_BOOL intraMdOpenLoop, + EB_U8 *depth, + EB_U8 *modeType, + EB_U8 *lumaMode, + MvUnit_t *mvUnit, + EB_U8 *skipFlag, + EB_U32 originX, + EB_U32 originY, + EB_U32 size, EB_U16 tileIdx, - EB_BOOL useIntraChromaflag) + EB_BOOL useIntraChromaflag) { - - NeighborArrayUnitDepthSkipWrite( - leafDepthNeighborArray, - (EB_U8*)depth, - originX, - originY, - size); + + NeighborArrayUnitDepthSkipWrite( + leafDepthNeighborArray, + (EB_U8*)depth, + originX, + originY, + size); NeighborArrayUnitModeTypeWrite( modeTypeNeighborArray, @@ -522,65 +522,65 @@ void MvMergePassUpdateNeighborArrays( (EB_U8*)lumaMode, originX, originY, - size); - - // *Note - this has to be changed for non-square PU support -- JMJ - NeighborArrayUnitMvWrite( - mvNeighborArray, - (EB_U8*)mvUnit, - originX, - originY, - size); - - NeighborArrayUnitDepthSkipWrite( - skipNeighborArray, - (EB_U8*)skipFlag, - originX, - originY, - size); + size); + + // *Note - this has to be changed for non-square PU support -- JMJ + NeighborArrayUnitMvWrite( + mvNeighborArray, + (EB_U8*)mvUnit, + originX, + originY, + size); + + NeighborArrayUnitDepthSkipWrite( + skipNeighborArray, + (EB_U8*)skipFlag, + originX, + originY, + size); if (intraMdOpenLoop == EB_FALSE) { - // Recon Samples - Luma - NeighborArrayUnitSampleWrite( - lumaReconSampleNeighborArray, - reconBuffer->bufferY, - reconBuffer->strideY, - originX & (lcuSize - 1), - originY & (lcuSize - 1), - originX, - originY, - size,//CHKN width, - size,//CHKN height, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - if (useIntraChromaflag){ - // Recon Samples - Cb - NeighborArrayUnitSampleWrite( - cbReconSampleNeighborArray, - reconBuffer->bufferCb, - reconBuffer->strideCb, - (originX & (lcuSize - 1)) >> 1, - (originY & (lcuSize - 1)) >> 1, - originX >> 1, - originY >> 1, - size >> 1, - size >> 1, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - // Recon Samples - Cr - NeighborArrayUnitSampleWrite( - crReconSampleNeighborArray, - reconBuffer->bufferCr, - reconBuffer->strideCr, - (originX & (lcuSize - 1)) >> 1, - (originY & (lcuSize - 1)) >> 1, - originX >> 1, - originY >> 1, - size >> 1, - size >> 1, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - } - } + // Recon Samples - Luma + NeighborArrayUnitSampleWrite( + lumaReconSampleNeighborArray, + reconBuffer->bufferY, + reconBuffer->strideY, + originX & (lcuSize - 1), + originY & (lcuSize - 1), + originX, + originY, + size,//CHKN width, + size,//CHKN height, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + if (useIntraChromaflag){ + // Recon Samples - Cb + NeighborArrayUnitSampleWrite( + cbReconSampleNeighborArray, + reconBuffer->bufferCb, + reconBuffer->strideCb, + (originX & (lcuSize - 1)) >> 1, + (originY & (lcuSize - 1)) >> 1, + originX >> 1, + originY >> 1, + size >> 1, + size >> 1, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + // Recon Samples - Cr + NeighborArrayUnitSampleWrite( + crReconSampleNeighborArray, + reconBuffer->bufferCr, + reconBuffer->strideCr, + (originX & (lcuSize - 1)) >> 1, + (originY & (lcuSize - 1)) >> 1, + originX >> 1, + originY >> 1, + size >> 1, + size >> 1, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + } + } @@ -668,7 +668,7 @@ void MvMergePassUpdateNeighborArrays( } - return; + return; } @@ -870,34 +870,34 @@ void Bdp16x16vs8x8RefinementUpdateNeighborArrays( } void DeriveMpmModes( - ModeDecisionContext_t *contextPtr, - CodingUnit_t * const cuPtr) { - EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; - EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; - - if (leftNeighborMode == topNeighborMode) { - if (leftNeighborMode > 1) { // For angular modes - contextPtr->mostProbableModeArray[0] = leftNeighborMode; - contextPtr->mostProbableModeArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - contextPtr->mostProbableModeArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - contextPtr->mostProbableModeArray[0] = EB_INTRA_PLANAR; - contextPtr->mostProbableModeArray[1] = EB_INTRA_DC; - contextPtr->mostProbableModeArray[2] = EB_INTRA_VERTICAL; - } - } - else { - contextPtr->mostProbableModeArray[0] = leftNeighborMode; - contextPtr->mostProbableModeArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - contextPtr->mostProbableModeArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - contextPtr->mostProbableModeArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } + ModeDecisionContext_t *contextPtr, + CodingUnit_t * const cuPtr) { + EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; + EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; + + if (leftNeighborMode == topNeighborMode) { + if (leftNeighborMode > 1) { // For angular modes + contextPtr->mostProbableModeArray[0] = leftNeighborMode; + contextPtr->mostProbableModeArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + contextPtr->mostProbableModeArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + contextPtr->mostProbableModeArray[0] = EB_INTRA_PLANAR; + contextPtr->mostProbableModeArray[1] = EB_INTRA_DC; + contextPtr->mostProbableModeArray[2] = EB_INTRA_VERTICAL; + } + } + else { + contextPtr->mostProbableModeArray[0] = leftNeighborMode; + contextPtr->mostProbableModeArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + contextPtr->mostProbableModeArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + contextPtr->mostProbableModeArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } } //*************************// // SetNfl @@ -905,13 +905,13 @@ void DeriveMpmModes( // the NFL candidates numbers are set //*************************// void SetNfl( - LargestCodingUnit_t *lcuPtr, - ModeDecisionContext_t *contextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_MD_STAGE mdStage) + LargestCodingUnit_t *lcuPtr, + ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_MD_STAGE mdStage) { - switch (mdStage) { - case MDC_STAGE: + switch (mdStage) { + case MDC_STAGE: // NFL Level MD Settings // 0 4 // 1 3 if 32x32, 2 otherwise @@ -919,7 +919,7 @@ void SetNfl( // 3 2 if Detectors, 1 otherwise // 4 2 if 64x64 or 32x32 or 16x16, 1 otherwise // 5 2 if 64x64 or 332x32, 1 otherwise - // 6 1 + // 6 1 if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuPtr->index] == LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE) { contextPtr->fullReconSearchCount = 1; } @@ -960,19 +960,19 @@ void SetNfl( } break; - case BDP_PILLAR_STAGE: - case BDP_16X16_8X8_REF_STAGE: + case BDP_PILLAR_STAGE: + case BDP_16X16_8X8_REF_STAGE: // NFL Level Pillar/8x8 Refinement Settings // 0 4 // 1 4 if depthRefinment, 3 if 32x32, 2 otherwise - // 2 3 + // 2 3 // 3 3 if depthRefinment or 32x32, 2 otherwise // 4 3 if 32x32, 2 otherwise - // 5 2 + // 5 2 // 6 2 if Detectors, 1 otherwise // 7 2 if 64x64 or 32x32 or 16x16, 1 otherwise // 8 2 if 64x64 or 332x32, 1 otherwise - // 9 1 + // 9 1 if (contextPtr->nflLevelPillar8x8ref == 0) { contextPtr->fullReconSearchCount = 4; } @@ -1025,18 +1025,18 @@ void SetNfl( break; case BDP_MVMERGE_STAGE: - case BDP_64X64_32X32_REF_STAGE: + case BDP_64X64_32X32_REF_STAGE: // NFL Level MvMerge/64x64 Refinement Settings // 0 4 - // 1 3 + // 1 3 // 2 3 if depthRefinment or 32x32, 2 otherwise // 3 3 if 32x32, 2 otherwise - // 4 2 + // 4 2 // 5 2 if Detectors, 1 otherwise // 6 2 if 64x64 or 32x32 or 16x16, 1 otherwise // 7 2 if 64x64 or 332x32, 1 otherwise - // 8 1 + // 8 1 if (contextPtr->nflLevelMvMerge64x64ref == 0) { contextPtr->fullReconSearchCount = 4; } @@ -1076,7 +1076,7 @@ void SetNfl( } break; - + default: break; } @@ -1089,8 +1089,8 @@ void SetNfl( // the NMM candidates numbers are set //*************************// void SetNmm( - ModeDecisionContext_t *contextPtr, - EB_MD_STAGE mdStage) + ModeDecisionContext_t *contextPtr, + EB_MD_STAGE mdStage) { // NMM Level MD Settings @@ -1106,8 +1106,8 @@ void SetNmm( // 3 2 - switch (mdStage) { - case MDC_STAGE: + switch (mdStage) { + case MDC_STAGE: if (contextPtr->nmmLevelMd == 0) { contextPtr->mvMergeSkipModeCount = 5; } @@ -1121,9 +1121,9 @@ void SetNmm( contextPtr->mvMergeSkipModeCount = 2; } - break; + break; - case BDP_PILLAR_STAGE: + case BDP_PILLAR_STAGE: case BDP_64X64_32X32_REF_STAGE: case BDP_16X16_8X8_REF_STAGE: case BDP_MVMERGE_STAGE: @@ -1148,7 +1148,7 @@ void SetNmm( if (contextPtr->cuSize == 32) contextPtr->mvMergeSkipModeCount = 3; else - contextPtr->mvMergeSkipModeCount = 2; + contextPtr->mvMergeSkipModeCount = 2; } else { contextPtr->mvMergeSkipModeCount = 2; @@ -1156,186 +1156,186 @@ void SetNmm( break; - default: - break; - } + default: + break; + } } - + void CheckHighCostPartition( - SequenceControlSet_t *sequenceControlSetPtr, - ModeDecisionContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr, - EB_U8 leafIndex, - EB_U8 *parentLeafIndexPtr, + SequenceControlSet_t *sequenceControlSetPtr, + ModeDecisionContext_t *contextPtr, + LargestCodingUnit_t *lcuPtr, + EB_U8 leafIndex, + EB_U8 *parentLeafIndexPtr, EB_BOOL enableExitPartitioning, - EB_U8 *exitPartitionPtr - ) + EB_U8 *exitPartitionPtr + ) { - EB_U8 parentLeafIndex; + EB_U8 parentLeafIndex; - if (sequenceControlSetPtr->lcuParamsArray[lcuPtr->index].isCompleteLcu && contextPtr->cuStats->depth>0) - { + if (sequenceControlSetPtr->lcuParamsArray[lcuPtr->index].isCompleteLcu && contextPtr->cuStats->depth>0) + { - const EB_U8 totChildren = MDSCAN_TO_QUADTREE_ID[leafIndex]; - EB_BOOL areGrandChildrenDone = EB_FALSE; - if (contextPtr->cuPtr->splitFlag == EB_FALSE) - areGrandChildrenDone = EB_TRUE; + const EB_U8 totChildren = MDSCAN_TO_QUADTREE_ID[leafIndex]; + EB_BOOL areGrandChildrenDone = EB_FALSE; + if (contextPtr->cuPtr->splitFlag == EB_FALSE) + areGrandChildrenDone = EB_TRUE; - if (enableExitPartitioning) + if (enableExitPartitioning) areGrandChildrenDone = (lcuPtr->pictureControlSetPtr->sliceType != EB_I_PICTURE) ? EB_TRUE : areGrandChildrenDone; - if (totChildren<4 && areGrandChildrenDone) - { - - parentLeafIndex = CHILD_MDSCAN_TO_PARENT_MDSCAN[leafIndex]; - if (contextPtr->mdLocalCuUnit[parentLeafIndex].testedCuFlag) - - { - //get parent cost. - EB_U64 depthNRate = 0; - SplitFlagRate( - contextPtr, - lcuPtr->codedLeafArrayPtr[parentLeafIndex], - 0, - &depthNRate, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - sequenceControlSetPtr->maxLcuDepth); - - EB_U64 parentCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; - - //get partition cost so far - EB_U64 totalChildrenCost = 0; - EB_U8 cuIt = leafIndex; - EB_U8 it; - for (it = 0; it < totChildren; it++) - { - totalChildrenCost += contextPtr->mdLocalCuUnit[cuIt].cost; - cuIt = cuIt - CuOffset[contextPtr->cuStats->depth]; - } - - if (enableExitPartitioning) - totalChildrenCost = lcuPtr->pictureControlSetPtr->temporalLayerIndex == 0 || contextPtr->edgeBlockNumFlag ? totalChildrenCost : (totalChildrenCost / totChildren) * 4; - - if (totalChildrenCost > parentCost) - { - *exitPartitionPtr = EB_TRUE; - *parentLeafIndexPtr = parentLeafIndex; - } - - } - - } - } + if (totChildren<4 && areGrandChildrenDone) + { + + parentLeafIndex = CHILD_MDSCAN_TO_PARENT_MDSCAN[leafIndex]; + if (contextPtr->mdLocalCuUnit[parentLeafIndex].testedCuFlag) + + { + //get parent cost. + EB_U64 depthNRate = 0; + SplitFlagRate( + contextPtr, + lcuPtr->codedLeafArrayPtr[parentLeafIndex], + 0, + &depthNRate, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + sequenceControlSetPtr->maxLcuDepth); + + EB_U64 parentCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; + + //get partition cost so far + EB_U64 totalChildrenCost = 0; + EB_U8 cuIt = leafIndex; + EB_U8 it; + for (it = 0; it < totChildren; it++) + { + totalChildrenCost += contextPtr->mdLocalCuUnit[cuIt].cost; + cuIt = cuIt - CuOffset[contextPtr->cuStats->depth]; + } + + if (enableExitPartitioning) + totalChildrenCost = lcuPtr->pictureControlSetPtr->temporalLayerIndex == 0 || contextPtr->edgeBlockNumFlag ? totalChildrenCost : (totalChildrenCost / totChildren) * 4; + + if (totalChildrenCost > parentCost) + { + *exitPartitionPtr = EB_TRUE; + *parentLeafIndexPtr = parentLeafIndex; + } + + } + + } + } } EB_U32 BdpCalculateNextCuIndex( - EB_U8 * leafDataArray, - EB_U32 cuIndex, - EB_U32 leafCount, - EB_U32 cuDepth - ) + EB_U8 * leafDataArray, + EB_U32 cuIndex, + EB_U32 leafCount, + EB_U32 cuDepth + ) { - EB_U32 cuIdx; - EB_U32 stepSplitFalse = 1; - EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1] + 1 : leafDataArray[cuIndex] + DepthOffset[cuDepth]; + EB_U32 cuIdx; + EB_U32 stepSplitFalse = 1; + EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1] + 1 : leafDataArray[cuIndex] + DepthOffset[cuDepth]; - for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ - // Assign CU data - const EB_U8 leafIndex = leafDataArray[cuIdx]; + for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ + // Assign CU data + const EB_U8 leafIndex = leafDataArray[cuIdx]; - if (leafIndex < nextLeafIndex){ - stepSplitFalse++; - } + if (leafIndex < nextLeafIndex){ + stepSplitFalse++; + } - else{ - break; - } + else{ + break; + } - } - return stepSplitFalse; + } + return stepSplitFalse; } // Calculate the next CU index EB_U32 CalculateNextCuIndex( - const EbMdcLeafData_t *const leafDataArray, - EB_U32 cuIndex, - EB_U32 leafCount, - EB_U32 cuDepth - ) + const EbMdcLeafData_t *const leafDataArray, + EB_U32 cuIndex, + EB_U32 leafCount, + EB_U32 cuDepth + ) { - EB_U32 cuIdx; - EB_U32 stepSplitFalse = 1; - EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1].leafIndex + 1 : leafDataArray[cuIndex].leafIndex + DepthOffset[cuDepth]; + EB_U32 cuIdx; + EB_U32 stepSplitFalse = 1; + EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1].leafIndex + 1 : leafDataArray[cuIndex].leafIndex + DepthOffset[cuDepth]; - for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ - // Assign CU data + for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ + // Assign CU data const EB_U8 leafIndex = leafDataArray[cuIdx].leafIndex; - //const EB_BOOL splitFlag = leafDataArray[cuIdx].splitFlag; - //const CodedUnitStats_t *cuStatsPtr = GetCodedUnitStats(leafIndex); + //const EB_BOOL splitFlag = leafDataArray[cuIdx].splitFlag; + //const CodedUnitStats_t *cuStatsPtr = GetCodedUnitStats(leafIndex); - if (leafIndex < nextLeafIndex){ - stepSplitFalse++; - } + if (leafIndex < nextLeafIndex){ + stepSplitFalse++; + } + + else{ + break; + } - else{ - break; - } - - } - return stepSplitFalse; + } + return stepSplitFalse; } void ConstructMdCuArray( - ModeDecisionContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, - const MdcLcuData_t * const mdcResultTbPtr) { - EB_U32 cuIdx = 0; - EB_U32 maxCuIndex = 0; + ModeDecisionContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + LargestCodingUnit_t *lcuPtr, + const MdcLcuData_t * const mdcResultTbPtr) { + EB_U32 cuIdx = 0; + EB_U32 maxCuIndex = 0; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuPtr->index]; - for (cuIdx = 0; cuIdx < mdcResultTbPtr->leafCount; ++cuIdx) { - maxCuIndex = MAX(maxCuIndex, mdcResultTbPtr->leafDataArray[cuIdx].leafIndex); - } + for (cuIdx = 0; cuIdx < mdcResultTbPtr->leafCount; ++cuIdx) { + maxCuIndex = MAX(maxCuIndex, mdcResultTbPtr->leafDataArray[cuIdx].leafIndex); + } // CU Loop - if (lcuParams->isCompleteLcu) + if (lcuParams->isCompleteLcu) - { + { cuIdx = 0; - do - { - CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[cuIdx]; - contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; - cuPtr->splitFlag = EB_TRUE; + do + { + CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[cuIdx]; + contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; - ++cuIdx; + ++cuIdx; } while (cuIdx < maxCuIndex); - } - else { - // Initialize the cost & skipFlag for each CU belonging to this tree block for the future usage by inter-depth decision - CodingUnit_t ** const codedLeafArrayPtr = lcuPtr->codedLeafArrayPtr; + } + else { + // Initialize the cost & skipFlag for each CU belonging to this tree block for the future usage by inter-depth decision + CodingUnit_t ** const codedLeafArrayPtr = lcuPtr->codedLeafArrayPtr; const unsigned codedLeafCount = CU_MAX_COUNT; - cuIdx = 0; - do - { - CodingUnit_t * const cuPtr = codedLeafArrayPtr[cuIdx]; - contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; - cuPtr->splitFlag = EB_TRUE; + cuIdx = 0; + do + { + CodingUnit_t * const cuPtr = codedLeafArrayPtr[cuIdx]; + contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; - ++cuIdx; + ++cuIdx; - } while (cuIdx < codedLeafCount); - } + } while (cuIdx < codedLeafCount); + } } void PerformInverseTransformRecon( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, ModeDecisionCandidateBuffer_t *candidateBuffer, CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr) { + const CodedUnitStats_t *cuStatsPtr) { const TransformUnitStats_t *tuStatPtr; EB_U32 tuSize; @@ -1345,7 +1345,7 @@ void PerformInverseTransformRecon( EB_U32 tuTotalCount; EB_U32 tuIndex; - EB_U32 tuItr; + EB_U32 tuItr; TransformUnit_t *tuPtr; // Recon not needed if Open-Loop INTRA, or if spatialSseFullLoop ON (where T-1 performed @ Full-Loop) @@ -1362,7 +1362,7 @@ void PerformInverseTransformRecon( tuSize = cuStatsPtr->size >> tuStatPtr->depth; tuOriginIndex = tuOriginX + tuOriginY * 64; - // Skip T-1 if 8x8 and INTRA4x4 is the winner as T-1 already performed @ INTRA4x4 search + // Skip T-1 if 8x8 and INTRA4x4 is the winner as T-1 already performed @ INTRA4x4 search if (!(cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4)) { @@ -1421,8 +1421,8 @@ void PerformInverseTransformRecon( EB_U32 crTuChromaOriginIndex = ((tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideCr) >> 1); - // Skip T-1 if 8x8 and INTRA4x4 is the winner and INTRA4x4 Chroma performed as T-1 already performed @ INTRA4x4 search - //if (!(cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4 && contextPtr->use4x4ChromaInformationInFullLoop)) + // Skip T-1 if 8x8 and INTRA4x4 is the winner and INTRA4x4 Chroma performed as T-1 already performed @ INTRA4x4 search + //if (!(cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4 && contextPtr->use4x4ChromaInformationInFullLoop)) { if (tuPtr->cbCbf) { @@ -1552,134 +1552,134 @@ void PerformInverseTransformRecon( * Coding Loop - Fast Loop Initialization *******************************************/ void ProductCodingLoopInitFastLoop( - ModeDecisionContext_t *contextPtr, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *skipFlagNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *leafDepthNeighborArray) + ModeDecisionContext_t *contextPtr, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *skipFlagNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray) { - // Keep track of the LCU Ptr - contextPtr->lumaIntraRefSamplesGenDone = EB_FALSE; - contextPtr->chromaIntraRefSamplesGenDone = EB_FALSE; - - // Generate Split, Skip and intra mode contexts for the rate estimation - CodingLoopContextGeneration( - contextPtr, - contextPtr->cuPtr, - contextPtr->cuOriginX, - contextPtr->cuOriginY, + // Keep track of the LCU Ptr + contextPtr->lumaIntraRefSamplesGenDone = EB_FALSE; + contextPtr->chromaIntraRefSamplesGenDone = EB_FALSE; + + // Generate Split, Skip and intra mode contexts for the rate estimation + CodingLoopContextGeneration( + contextPtr, + contextPtr->cuPtr, + contextPtr->cuOriginX, + contextPtr->cuOriginY, MAX_LCU_SIZE, intraLumaNeighborArray, skipFlagNeighborArray, modeTypeNeighborArray, leafDepthNeighborArray); - // *Notes - // -Instead of creating function pointers in a static array, put the func pointers in a queue - // -This function should also do the SAD calc for each mode - // -The best independent intra chroma mode should be determined here - // -Modify PictureBufferDesc to be able to create Luma, Cb, and/or Cr only buffers via flags - // -Have one PictureBufferDesc that points to the intra chroma buffer to be used. - // -Properly signal the DM mode at this point + // *Notes + // -Instead of creating function pointers in a static array, put the func pointers in a queue + // -This function should also do the SAD calc for each mode + // -The best independent intra chroma mode should be determined here + // -Modify PictureBufferDesc to be able to create Luma, Cb, and/or Cr only buffers via flags + // -Have one PictureBufferDesc that points to the intra chroma buffer to be used. + // -Properly signal the DM mode at this point - // Initialize the candidate buffer costs - { + // Initialize the candidate buffer costs + { EB_U32 bufferDepthIndexStart = contextPtr->bufferDepthIndexStart[contextPtr->cuStats->depth]; - EB_U32 bufferDepthIndexWidth = contextPtr->bufferDepthIndexWidth[contextPtr->cuStats->depth]; - EB_U32 index = 0; + EB_U32 bufferDepthIndexWidth = contextPtr->bufferDepthIndexWidth[contextPtr->cuStats->depth]; + EB_U32 index = 0; - for (index = 0; index < bufferDepthIndexWidth; ++index){ - contextPtr->fastCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; - contextPtr->fullCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; - } + for (index = 0; index < bufferDepthIndexWidth; ++index){ + contextPtr->fastCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; + contextPtr->fullCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; + } - } - return; + } + return; } static inline EB_ERRORTYPE ChromaPrediction( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, - EB_U32 cuChromaOriginIndex, - ModeDecisionContext_t *contextPtr) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, + EB_U32 cuChromaOriginIndex, + ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; (void) cuChromaOriginIndex; - if (candidateBuffer->candidatePtr->predictionIsReady == EB_FALSE) + if (candidateBuffer->candidatePtr->predictionIsReady == EB_FALSE) { - const EB_U8 type = candidateBuffer->candidatePtr->type; + const EB_U8 type = candidateBuffer->candidatePtr->type; - contextPtr->puOriginX = contextPtr->cuOriginX; + contextPtr->puOriginX = contextPtr->cuOriginX; - contextPtr->puOriginY = contextPtr->cuOriginY; + contextPtr->puOriginY = contextPtr->cuOriginY; - contextPtr->puWidth = contextPtr->cuSize; + contextPtr->puWidth = contextPtr->cuSize; - contextPtr->puHeight = contextPtr->cuSize; + contextPtr->puHeight = contextPtr->cuSize; - contextPtr->puItr = 0; + contextPtr->puItr = 0; - if (contextPtr->intraMdOpenLoopFlag){ + if (contextPtr->intraMdOpenLoopFlag){ PredictionFunTableOl[contextPtr->interpolationMethod][type]( - contextPtr, - PICTURE_BUFFER_DESC_CHROMA_MASK, - pictureControlSetPtr, - candidateBuffer); - } - else{ + contextPtr, + PICTURE_BUFFER_DESC_CHROMA_MASK, + pictureControlSetPtr, + candidateBuffer); + } + else{ PredictionFunTableCl[contextPtr->interpolationMethod][type]( - contextPtr, - PICTURE_BUFFER_DESC_CHROMA_MASK, - pictureControlSetPtr, - candidateBuffer); - } - } - - return return_error; + contextPtr, + PICTURE_BUFFER_DESC_CHROMA_MASK, + pictureControlSetPtr, + candidateBuffer); + } + } + + return return_error; } void ProductMdFastPuPrediction( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, - ModeDecisionContext_t *contextPtr, - EB_U32 useChromaInformationInFastLoop, - EB_U32 modeType, - ModeDecisionCandidate_t *const candidatePtr, - EB_U32 fastLoopCandidateIndex, - EB_U32 bestFirstFastCostSearchCandidateIndex) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, + ModeDecisionContext_t *contextPtr, + EB_U32 useChromaInformationInFastLoop, + EB_U32 modeType, + ModeDecisionCandidate_t *const candidatePtr, + EB_U32 fastLoopCandidateIndex, + EB_U32 bestFirstFastCostSearchCandidateIndex) { - contextPtr->puItr = 0; + contextPtr->puItr = 0; - // Prediction - if (contextPtr->intraMdOpenLoopFlag){ + // Prediction + if (contextPtr->intraMdOpenLoopFlag){ - EB_U32 predMask = useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK; - if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) - predMask = predMask & (~PICTURE_BUFFER_DESC_Y_FLAG); + EB_U32 predMask = useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK; + if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) + predMask = predMask & (~PICTURE_BUFFER_DESC_Y_FLAG); - candidateBuffer->candidatePtr->predictionIsReadyLuma = (EB_BOOL)(predMask & PICTURE_BUFFER_DESC_Y_FLAG); + candidateBuffer->candidatePtr->predictionIsReadyLuma = (EB_BOOL)(predMask & PICTURE_BUFFER_DESC_Y_FLAG); PredictionFunTableOl[contextPtr->interpolationMethod][modeType]( - contextPtr, - predMask, - pictureControlSetPtr, - candidateBuffer); + contextPtr, + predMask, + pictureControlSetPtr, + candidateBuffer); - } - else{ + } + else{ - candidateBuffer->candidatePtr->predictionIsReadyLuma = EB_TRUE; + candidateBuffer->candidatePtr->predictionIsReadyLuma = EB_TRUE; PredictionFunTableCl[contextPtr->interpolationMethod][modeType]( - contextPtr, - useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK, - pictureControlSetPtr, - candidateBuffer); + contextPtr, + useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK, + pictureControlSetPtr, + candidateBuffer); - } + } } @@ -1711,10 +1711,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList0PosX = 0; EB_U32 refList0PosY = 0; - EB_U32 integPosL0x; - EB_U32 integPosL0y; - EB_U8 counter; - EB_U16 *src0Ptr; + EB_U32 integPosL0x; + EB_U32 integPosL0y; + EB_U8 counter; + EB_U16 *src0Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; @@ -1756,10 +1756,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList1PosX = 0; EB_U32 refList1PosY = 0; - EB_U32 integPosL1x; - EB_U32 integPosL1y; - EB_U8 counter; - EB_U16 *src1Ptr; + EB_U32 integPosL1x; + EB_U32 integPosL1y; + EB_U8 counter; + EB_U16 *src1Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; @@ -1806,10 +1806,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList0PosX = 0; EB_U32 refList0PosY = 0; - EB_U32 integPosL0x; - EB_U32 integPosL0y; - EB_U8 counter; - EB_U8 *src0Ptr; + EB_U32 integPosL0x; + EB_U32 integPosL0y; + EB_U8 counter; + EB_U8 *src0Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture; @@ -1858,10 +1858,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList1PosX = 0; EB_U32 refList1PosY = 0; - EB_U32 integPosL1x; - EB_U32 integPosL1y; - EB_U8 counter; - EB_U8 *src1Ptr; + EB_U32 integPosL1x; + EB_U32 integPosL1y; + EB_U8 counter; + EB_U8 *src1Ptr; // List1 referenceObject = (EbReferenceObject_t *)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; @@ -1909,61 +1909,61 @@ void ModeDecisionPreFetchRef( } void ProductPerformFastLoop( - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - ModeDecisionContext_t *contextPtr, - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase, - ModeDecisionCandidate_t *fastCandidateArray, - EB_U32 fastCandidateTotalCount, - EbPictureBufferDesc_t *inputPicturePtr, - EB_U32 inputOriginIndex, - EB_U32 inputCbOriginIndex, - EB_U32 inputCrOriginIndex, - CodingUnit_t *cuPtr, - EB_U32 cuOriginIndex, - EB_U32 cuChromaOriginIndex, - EB_U32 maxBuffers, - EB_U32 *secondFastCostSearchCandidateTotalCount) { - - EB_S32 fastLoopCandidateIndex; - EB_U64 lumaFastDistortion; - EB_U64 chromaFastDistortion; - ModeDecisionCandidateBuffer_t *candidateBuffer; - const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - EB_U32 highestCostIndex; - EB_U64 highestCost; - EB_U32 isCandzz = 0; - const EB_U32 cuDepth = contextPtr->cuStats->depth; - const EB_U32 cuSize = contextPtr->cuStats->size; - EB_U32 firstFastCandidateTotalCount; - // Initialize first fast cost loop variables - EB_U64 bestFirstFastCostSearchCandidateCost = 0xFFFFFFFFFFFFFFFFull; - EB_S32 bestFirstFastCostSearchCandidateIndex = INVALID_FAST_CANDIDATE_INDEX; - SequenceControlSet_t *sequenceControlSetPtr = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr); - LcuBasedDetectors_t* mdPicLcuDetect = contextPtr->mdPicLcuDetect; - - if (contextPtr->singleFastLoopFlag == EB_FALSE) { - - firstFastCandidateTotalCount = 0; - // First Fast-Cost Search Candidate Loop - fastLoopCandidateIndex = fastCandidateTotalCount - 1; - do - { - lumaFastDistortion = 0; - - // Set the Candidate Buffer - candidateBuffer = candidateBufferPtrArrayBase[0]; - ModeDecisionCandidate_t *const candidatePtr = candidateBuffer->candidatePtr = &fastCandidateArray[fastLoopCandidateIndex]; - const unsigned distortionReady = candidatePtr->distortionReady; - - // Only check (src - src) candidates (Tier0 candidates) - if (!!distortionReady) - { - const EB_U32 type = candidatePtr->type; - - lumaFastDistortion = candidatePtr->meDistortion; - firstFastCandidateTotalCount++; - + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + ModeDecisionContext_t *contextPtr, + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase, + ModeDecisionCandidate_t *fastCandidateArray, + EB_U32 fastCandidateTotalCount, + EbPictureBufferDesc_t *inputPicturePtr, + EB_U32 inputOriginIndex, + EB_U32 inputCbOriginIndex, + EB_U32 inputCrOriginIndex, + CodingUnit_t *cuPtr, + EB_U32 cuOriginIndex, + EB_U32 cuChromaOriginIndex, + EB_U32 maxBuffers, + EB_U32 *secondFastCostSearchCandidateTotalCount) { + + EB_S32 fastLoopCandidateIndex; + EB_U64 lumaFastDistortion; + EB_U64 chromaFastDistortion; + ModeDecisionCandidateBuffer_t *candidateBuffer; + const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + EB_U32 highestCostIndex; + EB_U64 highestCost; + EB_U32 isCandzz = 0; + const EB_U32 cuDepth = contextPtr->cuStats->depth; + const EB_U32 cuSize = contextPtr->cuStats->size; + EB_U32 firstFastCandidateTotalCount; + // Initialize first fast cost loop variables + EB_U64 bestFirstFastCostSearchCandidateCost = 0xFFFFFFFFFFFFFFFFull; + EB_S32 bestFirstFastCostSearchCandidateIndex = INVALID_FAST_CANDIDATE_INDEX; + SequenceControlSet_t *sequenceControlSetPtr = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr); + LcuBasedDetectors_t* mdPicLcuDetect = contextPtr->mdPicLcuDetect; + + if (contextPtr->singleFastLoopFlag == EB_FALSE) { + + firstFastCandidateTotalCount = 0; + // First Fast-Cost Search Candidate Loop + fastLoopCandidateIndex = fastCandidateTotalCount - 1; + do + { + lumaFastDistortion = 0; + + // Set the Candidate Buffer + candidateBuffer = candidateBufferPtrArrayBase[0]; + ModeDecisionCandidate_t *const candidatePtr = candidateBuffer->candidatePtr = &fastCandidateArray[fastLoopCandidateIndex]; + const unsigned distortionReady = candidatePtr->distortionReady; + + // Only check (src - src) candidates (Tier0 candidates) + if (!!distortionReady) + { + const EB_U32 type = candidatePtr->type; + + lumaFastDistortion = candidatePtr->meDistortion; + firstFastCandidateTotalCount++; + // Fast Cost Calc ProductFastCostFuncOptTable[type][sliceType]( contextPtr, @@ -1975,24 +1975,24 @@ void ProductPerformFastLoop( contextPtr->fastLambda, pictureControlSetPtr); - // Keep track of the candidate index of the best (src - src) candidate - if (*(candidateBuffer->fastCostPtr) <= bestFirstFastCostSearchCandidateCost) { - bestFirstFastCostSearchCandidateIndex = fastLoopCandidateIndex; - bestFirstFastCostSearchCandidateCost = *(candidateBuffer->fastCostPtr); - } + // Keep track of the candidate index of the best (src - src) candidate + if (*(candidateBuffer->fastCostPtr) <= bestFirstFastCostSearchCandidateCost) { + bestFirstFastCostSearchCandidateIndex = fastLoopCandidateIndex; + bestFirstFastCostSearchCandidateCost = *(candidateBuffer->fastCostPtr); + } - // Initialize Fast Cost - to do not interact with the second Fast-Cost Search - *(candidateBuffer->fastCostPtr) = 0xFFFFFFFFFFFFFFFFull; - } - } while (--fastLoopCandidateIndex >= 0); - } + // Initialize Fast Cost - to do not interact with the second Fast-Cost Search + *(candidateBuffer->fastCostPtr) = 0xFFFFFFFFFFFFFFFFull; + } + } while (--fastLoopCandidateIndex >= 0); + } - // Second Fast-Cost Search Candidate Loop - *secondFastCostSearchCandidateTotalCount = 0; - highestCostIndex = contextPtr->bufferDepthIndexStart[cuDepth]; - fastLoopCandidateIndex = fastCandidateTotalCount - 1; + // Second Fast-Cost Search Candidate Loop + *secondFastCostSearchCandidateTotalCount = 0; + highestCostIndex = contextPtr->bufferDepthIndexStart[cuDepth]; + fastLoopCandidateIndex = fastCandidateTotalCount - 1; - EB_U16 lcuAddr = lcuPtr->index; + EB_U16 lcuAddr = lcuPtr->index; do { @@ -2039,17 +2039,17 @@ void ProductPerformFastLoop( // Skip distortion computation if the candidate is MPM if (candidateBuffer->candidatePtr->mpmFlag == EB_FALSE) { - if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) - lumaFastDistortion = candidatePtr->meDistortion; - else - // Y - lumaFastDistortion += (NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3] ( - inputBufferY, - inputStrideY, - predBufferY, - MAX_LCU_SIZE , - cuSize, - cuSize)); + if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) + lumaFastDistortion = candidatePtr->meDistortion; + else + // Y + lumaFastDistortion += (NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3] ( + inputBufferY, + inputStrideY, + predBufferY, + MAX_LCU_SIZE , + cuSize, + cuSize)); // Cb if (!!contextPtr->useChromaInformationInFastLoop) @@ -2057,13 +2057,13 @@ void ProductPerformFastLoop( EB_U8 * const inputBufferCb = inputPicturePtr->bufferCb + inputCbOriginIndex; EB_U8 * const predBufferCb = candidateBuffer->predictionPtr->bufferCb + cuChromaOriginIndex; - chromaFastDistortion += NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 4] ( - inputBufferCb, - inputPicturePtr->strideCb, - predBufferCb, - (MAX_LCU_SIZE >> 1) , - (cuSize >> 1) , - cuSize >> 1); + chromaFastDistortion += NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 4] ( + inputBufferCb, + inputPicturePtr->strideCb, + predBufferCb, + (MAX_LCU_SIZE >> 1) , + (cuSize >> 1) , + cuSize >> 1); EB_U8 * const inputBufferCr = inputPicturePtr->bufferCr + inputCrOriginIndex; @@ -2095,16 +2095,16 @@ void ProductPerformFastLoop( candidateBuffer->weightChromaDistortion = EB_TRUE; } - ProductFastCostFuncOptTable[candidatePtr->type][sliceType]( - contextPtr, - cuPtr, - candidateBuffer, - cuPtr->qp, - lumaFastDistortion, - chromaFastDistortion, - contextPtr->fastLambda, - pictureControlSetPtr); - + ProductFastCostFuncOptTable[candidatePtr->type][sliceType]( + contextPtr, + cuPtr, + candidateBuffer, + cuPtr->qp, + lumaFastDistortion, + chromaFastDistortion, + contextPtr->fastLambda, + pictureControlSetPtr); + candidateBuffer->candidatePtr->fastLoopLumaDistortion = (EB_U32)lumaFastDistortion; if (contextPtr->useIntraInterBias){ if (candidatePtr->type == INTRA_MODE) @@ -2123,8 +2123,8 @@ void ProductPerformFastLoop( } } - } - } + } + } if (sequenceControlSetPtr->staticConfig.improveSharpness) ApplyMvOverBoundariesBias( @@ -2141,7 +2141,7 @@ void ProductPerformFastLoop( (*secondFastCostSearchCandidateTotalCount)++; } - // Find the buffer with the highest cost + // Find the buffer with the highest cost if (fastLoopCandidateIndex) { // maxCost is volatile to prevent the compiler from loading 0xFFFFFFFFFFFFFF @@ -2184,65 +2184,65 @@ void ProductPerformFastLoop( void ApplyIntraInterModeBias( EB_BOOL intraInterCond1, EB_BOOL intraInterCond2, - EB_BOOL intraInterCond3, - EB_U64 *fullCostPtr) + EB_BOOL intraInterCond3, + EB_U64 *fullCostPtr) { *fullCostPtr += intraInterCond1 ? (*fullCostPtr * 30) / 100 : 0; *fullCostPtr += intraInterCond2 ? (*fullCostPtr * 30) / 100 : 0; - *fullCostPtr = intraInterCond3 ? *fullCostPtr * 3 : *fullCostPtr; + *fullCostPtr = intraInterCond3 ? *fullCostPtr * 3 : *fullCostPtr; } extern void GenerateIntraChromaReferenceSamplesMd( - ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr) { + ModeDecisionContext_t *contextPtr, + EbPictureBufferDesc_t *inputPicturePtr) { if (contextPtr->useChromaInformationInFullLoop && contextPtr->intraMdOpenLoopFlag == EB_FALSE) { - GenerateChromaIntraReferenceSamplesEncodePass( - EB_FALSE, - EB_TRUE, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuSize, - contextPtr->lcuSize, - contextPtr->cuDepth, - contextPtr->modeTypeNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - contextPtr->intraRefPtr, + GenerateChromaIntraReferenceSamplesEncodePass( + EB_FALSE, + EB_TRUE, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuSize, + contextPtr->lcuSize, + contextPtr->cuDepth, + contextPtr->modeTypeNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + contextPtr->intraRefPtr, EB_YUV420, EB_FALSE, - EB_FALSE, - EB_FALSE, - EB_FALSE); + EB_FALSE, + EB_FALSE, + EB_FALSE); - contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; + contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; - } + } else { - UpdateChromaNeighborSamplesArrayOL( - contextPtr->intraRefPtr, - inputPicturePtr, - inputPicturePtr->strideY, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - inputPicturePtr->strideCb, - inputPicturePtr->strideCr, - contextPtr->cuChromaOriginX, - contextPtr->cuChromaOriginY, - contextPtr->cuSize >> 1, - contextPtr->lcuPtr); - - contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; - } + UpdateChromaNeighborSamplesArrayOL( + contextPtr->intraRefPtr, + inputPicturePtr, + inputPicturePtr->strideY, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + inputPicturePtr->strideCb, + inputPicturePtr->strideCr, + contextPtr->cuChromaOriginX, + contextPtr->cuChromaOriginY, + contextPtr->cuSize >> 1, + contextPtr->lcuPtr); + + contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; + } } void DerivePartialFrequencyN2Flag( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr) { if (contextPtr->pfMdLevel == 0) { contextPtr->pfMdMode = PF_OFF; @@ -2261,9 +2261,9 @@ void DerivePartialFrequencyN2Flag( void PerformIntraPrediction( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, ModeDecisionCandidate_t *candidatePtr) { if (contextPtr->intraMdOpenLoopFlag){ @@ -2276,16 +2276,16 @@ void PerformIntraPrediction( contextPtr->puPtr = &contextPtr->cuPtr->predictionUnitArray[puItr]; PredictionFunTableOl[contextPtr->interpolationMethod][candidatePtr->type]( - contextPtr, - PICTURE_BUFFER_DESC_LUMA_MASK, - pictureControlSetPtr, - candidateBuffer); + contextPtr, + PICTURE_BUFFER_DESC_LUMA_MASK, + pictureControlSetPtr, + candidateBuffer); } } else{ SVT_LOG("ERR: prediction not ready"); } - + } // Skip smaller CU sizes if the current tested CU has the same depth as the TOP and LEFT CU @@ -2298,7 +2298,7 @@ void SkipSmallCu( EB_U16 lcuAddr = contextPtr->lcuPtr->index; if (pictureControlSetPtr->lcuPtrArray[lcuAddr]->auraStatus == AURA_STATUS_0 && (pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuAddr]).stationaryEdgeOverTimeFlag == 0) { - if (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth == cuDepth && contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth == cuDepth && cuPtr->splitFlag == EB_TRUE){ + if (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth == cuDepth && contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth == cuDepth && cuPtr->splitFlag == EB_TRUE){ cuPtr->splitFlag = EB_FALSE; } } @@ -2306,68 +2306,68 @@ void SkipSmallCu( } void Intra4x4CodingLoopContextGeneration( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, - EB_U32 puOriginX, - EB_U32 puOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray) + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, + EB_U32 puOriginX, + EB_U32 puOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - puOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - puOriginX); - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - puOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - puOriginX); + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + puOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + puOriginX); + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + puOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + puOriginX); contextPtr->intraLumaLeftModeArray[puIndex] = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); contextPtr->intraLumaTopModeArray[puIndex] = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((puOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((puOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - return; + return; } void Intra4x4VsIntra8x8( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr, EB_U8 *intra4x4LumaMode, - EB_U64 *intra4x4Cost, + EB_U64 *intra4x4Cost, EB_U64 *intra4x4FullDistortion, EB_BOOL useChromaInformationInFullLoop, - CodingUnit_t *cuPtr) + CodingUnit_t *cuPtr) { EB_U32 puIndex; if(cuPtr->predictionModeFlag!=INTRA_MODE) SVT_LOG("SVT [WARNING]: cuPtr->costLuma needs to be filled in inter case"); - if (*intra4x4Cost < contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma) { + if (*intra4x4Cost < contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma) { - if (useChromaInformationInFullLoop) { - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *intra4x4Cost; - } - else { - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma - *intra4x4Cost); - } + if (useChromaInformationInFullLoop) { + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *intra4x4Cost; + } + else { + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma - *intra4x4Cost); + } - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = (EB_U32)*intra4x4FullDistortion; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = (EB_U32)*intra4x4FullDistortion; cuPtr->predictionUnitArray->intraLumaMode = EB_INTRA_MODE_4x4; for (puIndex = 0; puIndex < 4; puIndex++) { - + lcuPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2) + puIndex] = intra4x4LumaMode[puIndex]; } } @@ -2419,7 +2419,7 @@ EB_ERRORTYPE Intra4x4ModeDecisionControl( EB_U32 *bufferTotalCountPtr, EB_U32 *candidateTotalCountPtr, ModeDecisionCandidate_t **candidatePtrArray, - EB_U32 bestIntraMode) + EB_U32 bestIntraMode) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -2438,7 +2438,7 @@ EB_ERRORTYPE Intra4x4ModeDecisionControl( candidatePtrArray[canTotalCnt]->distortionReady = 0; canTotalCnt++; } - } + } else { // DC candidatePtrArray[canTotalCnt]->type = INTRA_MODE; @@ -2485,60 +2485,60 @@ EB_ERRORTYPE Intra4x4ModeDecisionControl( EB_ERRORTYPE Intra4x4PreModeDecision( - EB_U32 bufferTotalCount, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 *fullCandidateTotalCountPtr, - EB_U8 *bestCandidateIndexArray) + EB_U32 bufferTotalCount, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 *fullCandidateTotalCountPtr, + EB_U8 *bestCandidateIndexArray) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 fullCandidateIndex; - EB_U32 fullReconCandidateCount; - EB_U32 highestCostIndex; - EB_U64 highestCost; - EB_U32 candIndx = 0, i; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 fullCandidateIndex; + EB_U32 fullReconCandidateCount; + EB_U32 highestCostIndex; + EB_U64 highestCost; + EB_U32 candIndx = 0, i; - *fullCandidateTotalCountPtr = bufferTotalCount; + *fullCandidateTotalCountPtr = bufferTotalCount; - //Second, We substract one, because with N buffers we can determine the best N-1 candidates. - //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough - fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr) - 1); + //Second, We substract one, because with N buffers we can determine the best N-1 candidates. + //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough + fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr) - 1); - //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. - highestCost = *(bufferPtrArray[0]->fastCostPtr); - highestCostIndex = 0; + //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. + highestCost = *(bufferPtrArray[0]->fastCostPtr); + highestCostIndex = 0; - if (bufferTotalCount > 1){ - for (i = 1; i < bufferTotalCount; i++) { + if (bufferTotalCount > 1){ + for (i = 1; i < bufferTotalCount; i++) { - if (*(bufferPtrArray[i]->fastCostPtr) >= highestCost){ - highestCost = *(bufferPtrArray[i]->fastCostPtr); - highestCostIndex = i; - } - } - for (i = 0; i < bufferTotalCount; i++) { + if (*(bufferPtrArray[i]->fastCostPtr) >= highestCost){ + highestCost = *(bufferPtrArray[i]->fastCostPtr); + highestCostIndex = i; + } + } + for (i = 0; i < bufferTotalCount; i++) { - if (i != highestCostIndex){ - bestCandidateIndexArray[candIndx++] = (EB_U8)i; - } - } - } - else - bestCandidateIndexArray[0] = 0; + if (i != highestCostIndex){ + bestCandidateIndexArray[candIndx++] = (EB_U8)i; + } + } + } + else + bestCandidateIndexArray[0] = 0; - // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount - (*fullCandidateTotalCountPtr) = fullReconCandidateCount; + // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount + (*fullCandidateTotalCountPtr) = fullReconCandidateCount; - for (i = 0; i < fullReconCandidateCount; ++i) { - fullCandidateIndex = bestCandidateIndexArray[i]; + for (i = 0; i < fullReconCandidateCount; ++i) { + fullCandidateIndex = bestCandidateIndexArray[i]; - // Next, Set the transformSize - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = TRANSFORM_MIN_SIZE; - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = TRANSFORM_MIN_SIZE; + // Next, Set the transformSize + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = TRANSFORM_MIN_SIZE; + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = TRANSFORM_MIN_SIZE; - } + } - return return_error; + return return_error; } static void Intra4x4InitFastLoop( @@ -2547,7 +2547,7 @@ static void Intra4x4InitFastLoop( LargestCodingUnit_t *lcuPtr, EB_U32 partitionOriginX, EB_U32 partitionOriginY, - EB_BOOL useIntraChromaflag, + EB_BOOL useIntraChromaflag, EB_U32 puIndex) { @@ -2561,8 +2561,8 @@ static void Intra4x4InitFastLoop( MIN_PU_SIZE, MAX_LCU_SIZE, 3, - contextPtr->modeTypeNeighborArray, - contextPtr->lumaReconNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->lumaReconNeighborArray, (NeighborArrayUnit_t *) EB_NULL, (NeighborArrayUnit_t *) EB_NULL, contextPtr->intraRefPtr, @@ -2585,26 +2585,26 @@ static void Intra4x4InitFastLoop( lcuPtr); } - if (useIntraChromaflag){ - GenerateChromaIntraReferenceSamplesEncodePass( - EB_FALSE, - EB_TRUE, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuSize, - contextPtr->lcuSize, - contextPtr->cuDepth, - contextPtr->modeTypeNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - contextPtr->intraRefPtr, + if (useIntraChromaflag){ + GenerateChromaIntraReferenceSamplesEncodePass( + EB_FALSE, + EB_TRUE, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuSize, + contextPtr->lcuSize, + contextPtr->cuDepth, + contextPtr->modeTypeNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + contextPtr->intraRefPtr, EB_YUV420, EB_FALSE, - EB_FALSE, - EB_FALSE, - EB_FALSE); - } + EB_FALSE, + EB_FALSE, + EB_FALSE); + } // Generate Split, Skip and intra mode contexts for the rate estimation Intra4x4CodingLoopContextGeneration( contextPtr, @@ -2671,66 +2671,66 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( LargestCodingUnit_t *lcuPtr, CodingUnit_t *cuPtr, ModeDecisionContext_t *contextPtr, - EB_U32 bestIntraMode) + EB_U32 bestIntraMode) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - // Candidate Buffer - ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidate_t *candidatePtr; - EB_U32 candidateIndex = 0; - EB_U32 highestCostIndex; - EB_U32 bufferIndex; - EB_U32 bufferIndexEnd; - EB_U32 maxBuffers; - EB_U32 bufferTotalCount; - - - // Fast loop - EB_S32 fastLoopCandidateIndex; - EB_U32 fastCandidateTotalCount; - EB_U64 lumaFastDistortion; - //EB_U64 chromaFastDistortion; - EB_U64 highestCost; - - // Full Loop - EB_U32 fullLoopCandidateIndex; - EB_U32 fullCandidateTotalCount; - EB_U64 yFullDistortion[DIST_CALC_TOTAL]; - EB_U32 countNonZeroCoeffs; - EB_U64 yCoeffBits; - EB_U32 lumaShift; - - EbPictureBufferDesc_t *tuTransCoeffTmpPtr; - EbPictureBufferDesc_t *tuQuantCoeffTmpPtr; - EbPictureBufferDesc_t *transformBuffer; + EB_ERRORTYPE return_error = EB_ErrorNone; + + // Candidate Buffer + ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; + ModeDecisionCandidateBuffer_t *candidateBuffer; + ModeDecisionCandidate_t *candidatePtr; + EB_U32 candidateIndex = 0; + EB_U32 highestCostIndex; + EB_U32 bufferIndex; + EB_U32 bufferIndexEnd; + EB_U32 maxBuffers; + EB_U32 bufferTotalCount; + + + // Fast loop + EB_S32 fastLoopCandidateIndex; + EB_U32 fastCandidateTotalCount; + EB_U64 lumaFastDistortion; + //EB_U64 chromaFastDistortion; + EB_U64 highestCost; + + // Full Loop + EB_U32 fullLoopCandidateIndex; + EB_U32 fullCandidateTotalCount; + EB_U64 yFullDistortion[DIST_CALC_TOTAL]; + EB_U32 countNonZeroCoeffs; + EB_U64 yCoeffBits; + EB_U32 lumaShift; + + EbPictureBufferDesc_t *tuTransCoeffTmpPtr; + EbPictureBufferDesc_t *tuQuantCoeffTmpPtr; + EbPictureBufferDesc_t *transformBuffer; EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U32 inputOriginIndex; - EB_U32 puOriginIndex; + EB_U32 puOriginIndex; - EB_U8 intra4x4LumaMode[4]; - EB_U64 intra4x4Cost = 0; - EB_U64 intra4x4FullDistortion = 0; + EB_U8 intra4x4LumaMode[4]; + EB_U64 intra4x4Cost = 0; + EB_U64 intra4x4FullDistortion = 0; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; EB_U8 partitionIndex; - EB_BOOL use4x4ChromaInformation = EB_FALSE; - EB_U32 inputChromaOriginIndex; - EB_U32 puChromaOriginIndex; - EB_U64 chromaFastDistortion; - EB_U64 cbFullDistortion[DIST_CALC_TOTAL]; - EB_U32 cbCountNonZeroCoeffs; - EB_U64 cbCoeffBits; - EB_U64 crFullDistortion[DIST_CALC_TOTAL]; - EB_U32 crCountNonZeroCoeffs; - EB_U64 crCoeffBits; - EB_U32 chromaShift; - + EB_BOOL use4x4ChromaInformation = EB_FALSE; + EB_U32 inputChromaOriginIndex; + EB_U32 puChromaOriginIndex; + EB_U64 chromaFastDistortion; + EB_U64 cbFullDistortion[DIST_CALC_TOTAL]; + EB_U32 cbCountNonZeroCoeffs; + EB_U64 cbCoeffBits; + EB_U64 crFullDistortion[DIST_CALC_TOTAL]; + EB_U32 crCountNonZeroCoeffs; + EB_U64 crCoeffBits; + EB_U32 chromaShift; + if (contextPtr->coeffCabacUpdate) EB_MEMCPY(&(contextPtr->i4x4CoeffCtxModel), &(contextPtr->latestValidCoeffCtxModel), sizeof(CoeffCtxtMdl_t)); @@ -2763,7 +2763,7 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( use4x4ChromaInformation, partitionIndex); - // To move out of the PU loop in case all PUs are going to share same number of fast/full loop candidates + // To move out of the PU loop in case all PUs are going to share same number of fast/full loop candidates Intra4x4ModeDecisionControl( contextPtr, &bufferTotalCount, @@ -2785,7 +2785,7 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[MAX_LEVEL_COUNT - 1]); // Fast-Cost Search Candidate Loop - // -Prediction + // -Prediction // -(Input - Prediction) & SAD // -Fast cost calc @@ -2795,7 +2795,7 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( chromaFastDistortion = 0; - // Find the buffer with the highest cost + // Find the buffer with the highest cost highestCostIndex = contextPtr->bufferDepthIndexStart[MAX_LEVEL_COUNT - 1]; bufferIndex = highestCostIndex + 1; bufferIndexEnd = highestCostIndex + maxBuffers; @@ -2936,9 +2936,9 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( crCoeffBits = 0; crCountNonZeroCoeffs = 0; - // Set the Candidate Buffer + // Set the Candidate Buffer candidateBuffer = candidateBufferPtrArray[candidateIndex]; - candidatePtr = candidateBuffer->candidatePtr;//this is the FastCandidateStruct + candidatePtr = candidateBuffer->candidatePtr;//this is the FastCandidateStruct //4x4CandBuff <-- latest4x4 if (contextPtr->coeffCabacUpdate) @@ -3030,7 +3030,7 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( transformBuffer = contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr; // *Full Distortion (SSE) // *Note - there are known issues with how this distortion metric is currently - // calculated. The amount of scaling between the two arrays is not + // calculated. The amount of scaling between the two arrays is not // equivalent. PictureFullDistortionLuma( transformBuffer, @@ -3147,7 +3147,7 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( transformBuffer = contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr; // *Full Distortion (SSE) // *Note - there are known issues with how this distortion metric is currently - // calculated. The amount of scaling between the two arrays is not + // calculated. The amount of scaling between the two arrays is not EB_U32 nonZCoef[3]; EB_U64 zeroDis[2] = { 0 }; @@ -3437,7 +3437,7 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( fullCandidateTotalCount, contextPtr->bestCandidateIndexArray); - // Set Candidate Buffer to the selected mode + // Set Candidate Buffer to the selected mode candidateBuffer = candidateBufferPtrArray[candidateIndex]; //latest4x4 <-- 4x4CandBuff @@ -3566,23 +3566,23 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( } } } - // Update Neighbor Arrays - EB_U8 predictionModeFlag = (EB_U8)candidateBuffer->candidatePtr->type; - EB_U8 intraLumaMode = (EB_U8)candidateBuffer->candidatePtr->intraLumaMode; + // Update Neighbor Arrays + EB_U8 predictionModeFlag = (EB_U8)candidateBuffer->candidatePtr->type; + EB_U8 intraLumaMode = (EB_U8)candidateBuffer->candidatePtr->intraLumaMode; - NeighborArrayUnitModeTypeWrite( + NeighborArrayUnitModeTypeWrite( contextPtr->modeTypeNeighborArray, - &predictionModeFlag, - partitionOriginX, - partitionOriginY, - MIN_PU_SIZE); + &predictionModeFlag, + partitionOriginX, + partitionOriginY, + MIN_PU_SIZE); - NeighborArrayUnitIntraWrite( + NeighborArrayUnitIntraWrite( contextPtr->intraLumaModeNeighborArray, - &intraLumaMode, - partitionOriginX, - partitionOriginY, - MIN_PU_SIZE); + &intraLumaMode, + partitionOriginX, + partitionOriginY, + MIN_PU_SIZE); if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) { @@ -3598,37 +3598,37 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( MIN_PU_SIZE, NEIGHBOR_ARRAY_UNIT_FULL_MASK); - if (use4x4ChromaInformation) { - // Recon Samples - Cb - NeighborArrayUnitSampleWrite( - contextPtr->cbReconNeighborArray, - candidateBuffer->reconPtr->bufferCb, - candidateBuffer->reconPtr->strideCb, - partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginX >> 1, - partitionOriginY >> 1, - MIN_PU_SIZE, - MIN_PU_SIZE, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - // Recon Samples - Cr - NeighborArrayUnitSampleWrite( - contextPtr->crReconNeighborArray, - candidateBuffer->reconPtr->bufferCr, - candidateBuffer->reconPtr->strideCr, - partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginX >> 1, - partitionOriginY >> 1, - MIN_PU_SIZE, - MIN_PU_SIZE, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - } + if (use4x4ChromaInformation) { + // Recon Samples - Cb + NeighborArrayUnitSampleWrite( + contextPtr->cbReconNeighborArray, + candidateBuffer->reconPtr->bufferCb, + candidateBuffer->reconPtr->strideCb, + partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginX >> 1, + partitionOriginY >> 1, + MIN_PU_SIZE, + MIN_PU_SIZE, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + // Recon Samples - Cr + NeighborArrayUnitSampleWrite( + contextPtr->crReconNeighborArray, + candidateBuffer->reconPtr->bufferCr, + candidateBuffer->reconPtr->strideCr, + partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginX >> 1, + partitionOriginY >> 1, + MIN_PU_SIZE, + MIN_PU_SIZE, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + } } - } + } if (contextPtr->useIntraInterBias){ ApplyIntraInterModeBias( @@ -3638,74 +3638,74 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( &intra4x4Cost); } - Intra4x4VsIntra8x8( - contextPtr, + Intra4x4VsIntra8x8( + contextPtr, lcuPtr, - &(intra4x4LumaMode[0]), - &intra4x4Cost, - &intra4x4FullDistortion, - contextPtr->use4x4ChromaInformationInFullLoop, - cuPtr); + &(intra4x4LumaMode[0]), + &intra4x4Cost, + &intra4x4FullDistortion, + contextPtr->use4x4ChromaInformationInFullLoop, + cuPtr); - return return_error; + return return_error; } void ModeDecisionRefinementUpdateNeighborArrays( ModeDecisionContext_t *contextPtr, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *lumaReconSampleNeighborArray, - EB_BOOL intra4x4Selected, - EB_U8 *modeType, - EB_U8 *lumaMode, - EB_U32 originX, - EB_U32 originY, - EB_U32 size) + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *lumaReconSampleNeighborArray, + EB_BOOL intra4x4Selected, + EB_U8 *modeType, + EB_U8 *lumaMode, + EB_U32 originX, + EB_U32 originY, + EB_U32 size) { - if (intra4x4Selected == EB_FALSE){ - - NeighborArrayUnitModeTypeWrite( - modeTypeNeighborArray, - (EB_U8*)modeType, - originX, - originY, - size); - - NeighborArrayUnitIntraWrite( - intraLumaModeNeighborArray, - (EB_U8*)lumaMode, - originX, - originY, - size); - - // Recon Samples - Luma - NeighborArrayUnitSampleWrite( - lumaReconSampleNeighborArray, - contextPtr->mdReconBuffer->bufferY, - contextPtr->mdReconBuffer->strideY, - originX & (MAX_LCU_SIZE - 1), - originY & (MAX_LCU_SIZE - 1), - originX, - originY, - size, - size, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - } - - return; + if (intra4x4Selected == EB_FALSE){ + + NeighborArrayUnitModeTypeWrite( + modeTypeNeighborArray, + (EB_U8*)modeType, + originX, + originY, + size); + + NeighborArrayUnitIntraWrite( + intraLumaModeNeighborArray, + (EB_U8*)lumaMode, + originX, + originY, + size); + + // Recon Samples - Luma + NeighborArrayUnitSampleWrite( + lumaReconSampleNeighborArray, + contextPtr->mdReconBuffer->bufferY, + contextPtr->mdReconBuffer->strideY, + originX & (MAX_LCU_SIZE - 1), + originY & (MAX_LCU_SIZE - 1), + originX, + originY, + size, + size, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + } + + return; } void UpdateMdNeighborArrays( PictureControlSet_t *pictureControlSetPtr, ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_U8 *depth, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_U8 *depth, EB_U8 *modeType, EB_U8 *lumaMode, MvUnit_t *mvUnit, @@ -3806,7 +3806,7 @@ EB_EXTERN EB_ERRORTYPE LinkBdptoMd( LargestCodingUnit_t *lcuPtr, ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; EB_U8 leafIndex = 0; @@ -3831,7 +3831,7 @@ EB_EXTERN EB_ERRORTYPE LinkBdptoMd( EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; - // intraLumaMode 36 is used to signal INTRA4x4, and when INTRA4x4 is selected intra4x4Mode should be read from intra4x4Mode array + // intraLumaMode 36 is used to signal INTRA4x4, and when INTRA4x4 is selected intra4x4Mode should be read from intra4x4Mode array // the upper right INTRA4x4 mode (partition index 0) is used to update the intra mode neighbor array EB_U8 intraLumaMode = (cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4) ? (EB_U8)lcuPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[leafIndex] - 21) << 2)] : @@ -3852,7 +3852,7 @@ EB_EXTERN EB_ERRORTYPE LinkBdptoMd( contextPtr->cuOriginX, contextPtr->cuOriginY, contextPtr->cuStats->size, - lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL); + lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL); leafIndex += DepthOffset[contextPtr->cuStats->depth]; @@ -3868,9 +3868,9 @@ EB_EXTERN EB_ERRORTYPE LinkBdptoMd( void UpdateBdpNeighborArrays( PictureControlSet_t *pictureControlSetPtr, ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_U8 *depth, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_U8 *depth, EB_U8 *modeType, EB_U8 *lumaMode, MvUnit_t *mvUnit, @@ -3974,7 +3974,7 @@ EB_EXTERN EB_ERRORTYPE LinkMdtoBdp( LargestCodingUnit_t *lcuPtr, ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; EB_U8 leafIndex = 0; @@ -3999,7 +3999,7 @@ EB_EXTERN EB_ERRORTYPE LinkMdtoBdp( EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; - // intraLumaMode 36 is used to signal INTRA4x4, and when INTRA4x4 is selected intra4x4Mode should be read from intra4x4Mode array + // intraLumaMode 36 is used to signal INTRA4x4, and when INTRA4x4 is selected intra4x4Mode should be read from intra4x4Mode array // the upper right INTRA4x4 mode (partition index 0) is used to update the intra mode neighbor array EB_U8 intraLumaMode = (cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4) ? (EB_U8)lcuPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[leafIndex] - 21) << 2)] : @@ -4020,7 +4020,7 @@ EB_EXTERN EB_ERRORTYPE LinkMdtoBdp( contextPtr->cuOriginX, contextPtr->cuOriginY, contextPtr->cuStats->size, - lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL); + lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL); leafIndex += DepthOffset[contextPtr->cuStats->depth]; } @@ -4034,13 +4034,13 @@ EB_EXTERN EB_ERRORTYPE LinkMdtoBdp( EB_EXTERN EB_ERRORTYPE ModeDecisionRefinementLcu( - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, EB_U32 lcuOriginX, EB_U32 lcuOriginY, - ModeDecisionContext_t *contextPtr) + ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; EB_U16 tileIdx = contextPtr->tileIndex; contextPtr->intraLumaModeNeighborArray = pictureControlSetPtr->mdRefinementIntraLumaModeNeighborArray[tileIdx]; @@ -4049,7 +4049,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionRefinementLcu( contextPtr->lcuPtr = lcuPtr; - + EB_U8 leafIndex = 0; while (leafIndex < CU_MAX_COUNT) { @@ -4059,7 +4059,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionRefinementLcu( if (cuPtr->splitFlag == EB_FALSE) { const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); - + // Initialize CU info contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuOriginX = (EB_U16) (lcuOriginX + cuStatsPtr->originX); @@ -4071,7 +4071,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionRefinementLcu( // Generate Split, Skip and intra mode contexts for the rate estimation ModeDecisionRefinementContextGeneration( - contextPtr, + contextPtr, contextPtr->cuPtr, contextPtr->cuOriginX, contextPtr->cuOriginY, @@ -4112,7 +4112,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionRefinementLcu( leafIndex++; } } - + return return_error; } @@ -4120,39 +4120,39 @@ void UpdateMdReconBuffer( EbPictureBufferDesc_t *reconSrcPtr, EbPictureBufferDesc_t *reconDstPtr, ModeDecisionContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr) + LargestCodingUnit_t *lcuPtr) { - if ((contextPtr->cuStats->size >> 3) < 9) { - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][contextPtr->cuStats->size >> 3]( - &(reconSrcPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconSrcPtr->strideY]), - reconSrcPtr->strideY, - &(reconDstPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconDstPtr->strideY]), - reconDstPtr->strideY, - contextPtr->cuStats->size, - contextPtr->cuStats->size); - - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL) { - EB_U8 chromaSize = contextPtr->cuStats->size >> 1; - EB_U16 chromaOriginX = contextPtr->cuStats->originX >> 1; - EB_U16 chromaOriginY = contextPtr->cuStats->originY >> 1; - - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( - &(reconSrcPtr->bufferCb[chromaOriginX + chromaOriginY * reconSrcPtr->strideCb]), - reconSrcPtr->strideCb, - &(reconDstPtr->bufferCb[chromaOriginX + chromaOriginY * reconDstPtr->strideCb]), - reconDstPtr->strideCb, - chromaSize, - chromaSize); - - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( - &(reconSrcPtr->bufferCr[chromaOriginX + chromaOriginY * reconSrcPtr->strideCr]), - reconSrcPtr->strideCr, - &(reconDstPtr->bufferCr[chromaOriginX + chromaOriginY * reconDstPtr->strideCr]), - reconDstPtr->strideCr, - chromaSize, - chromaSize); - } - } + if ((contextPtr->cuStats->size >> 3) < 9) { + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][contextPtr->cuStats->size >> 3]( + &(reconSrcPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconSrcPtr->strideY]), + reconSrcPtr->strideY, + &(reconDstPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconDstPtr->strideY]), + reconDstPtr->strideY, + contextPtr->cuStats->size, + contextPtr->cuStats->size); + + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL) { + EB_U8 chromaSize = contextPtr->cuStats->size >> 1; + EB_U16 chromaOriginX = contextPtr->cuStats->originX >> 1; + EB_U16 chromaOriginY = contextPtr->cuStats->originY >> 1; + + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( + &(reconSrcPtr->bufferCb[chromaOriginX + chromaOriginY * reconSrcPtr->strideCb]), + reconSrcPtr->strideCb, + &(reconDstPtr->bufferCb[chromaOriginX + chromaOriginY * reconDstPtr->strideCb]), + reconDstPtr->strideCb, + chromaSize, + chromaSize); + + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( + &(reconSrcPtr->bufferCr[chromaOriginX + chromaOriginY * reconSrcPtr->strideCr]), + reconSrcPtr->strideCr, + &(reconDstPtr->bufferCr[chromaOriginX + chromaOriginY * reconDstPtr->strideCr]), + reconDstPtr->strideCr, + chromaSize, + chromaSize); + } + } } void AddChromaEncDec( @@ -4163,10 +4163,10 @@ void AddChromaEncDec( EncDecContext_t *contextPtrED, EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputCbOriginIndex, - EB_U32 cuChromaOriginIndex, + EB_U32 cuChromaOriginIndex, EB_U32 candIdxInput) { - + EB_U64 yFullDistortion[DIST_CALC_TOTAL]; EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU]; @@ -4174,24 +4174,24 @@ void AddChromaEncDec( EB_U64 crFullDistortion[DIST_CALC_TOTAL]; EB_U64 yCoeffBits; - EB_U64 cbCoeffBits = 0; - EB_U64 crCoeffBits = 0; + EB_U64 cbCoeffBits = 0; + EB_U64 crCoeffBits = 0; const CodedUnitStats_t *cuStatsPtr = contextPtrED->cuStats; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidate_t *candidatePtr; + ModeDecisionCandidate_t *candidatePtr; - // Set the Candidate Buffer + // Set the Candidate Buffer candidateBuffer = candidateBufferPtrArray[candIdxInput]; candidatePtr = candidateBuffer->candidatePtr; candidatePtr->type = INTER_MODE; candidatePtr->mergeFlag = EB_TRUE; candidatePtr->predictionIsReady = EB_FALSE; - + PredictionUnit_t *puPtr = & cuPtr->predictionUnitArray[0]; @@ -4203,33 +4203,33 @@ void AddChromaEncDec( if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_0) - { + { //EB_MEMCPY(&candidatePtr->MVsL0,&puPtr->mv[REF_LIST_0].x,4); - candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; - candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; + candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; + candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; - } + } - if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) - { - //EB_MEMCPY(&candidatePtr->MVsL1,&puPtr->mv[REF_LIST_1].x,4); - candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; - candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; - } + if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) + { + //EB_MEMCPY(&candidatePtr->MVsL1,&puPtr->mv[REF_LIST_1].x,4); + candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; + candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; + } - if (puPtr->interPredDirectionIndex == BI_PRED) - { - candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; - candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; - candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; - candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; + if (puPtr->interPredDirectionIndex == BI_PRED) + { + candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; + candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; + candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; + candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; - } + } // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); candidatePtr->yCbf = contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf; @@ -4280,7 +4280,7 @@ void AddChromaEncDec( contextPtr->cuSize >> 1, contextPtr->cuSize >> 1); - + EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); EB_U8 cbQp = MapChromaQp(qpScaled); @@ -4294,7 +4294,7 @@ void AddChromaEncDec( contextPtr, cuStatsPtr, inputPicturePtr, - pictureControlSetPtr, + pictureControlSetPtr, PICTURE_BUFFER_DESC_CHROMA_MASK, cbQp, crQp, @@ -4343,8 +4343,8 @@ void AddChromaEncDec( transChromaformSize, pictureControlSetPtr); - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *candidateBuffer->fullCostMergePtr; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *candidateBuffer->fullCostSkipPtr; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *candidateBuffer->fullCostMergePtr; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *candidateBuffer->fullCostSkipPtr; } @@ -4356,25 +4356,25 @@ void PerformFullLoop( EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputOriginIndex, EB_U32 inputCbOriginIndex, - EB_U32 cuOriginIndex, - EB_U32 cuChromaOriginIndex, + EB_U32 cuOriginIndex, + EB_U32 cuChromaOriginIndex, EB_U32 fullCandidateTotalCount) { - EB_U32 prevRootCbf; + EB_U32 prevRootCbf; EB_U64 bestfullCost; - EB_U32 fullLoopCandidateIndex; + EB_U32 fullLoopCandidateIndex; EB_U8 candidateIndex; - EB_U64 yFullDistortion[DIST_CALC_TOTAL]; - EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU]; + EB_U64 yFullDistortion[DIST_CALC_TOTAL]; + EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU]; EB_U64 cbFullDistortion[DIST_CALC_TOTAL]; - EB_U64 crFullDistortion[DIST_CALC_TOTAL]; + EB_U64 crFullDistortion[DIST_CALC_TOTAL]; - EB_U64 yCoeffBits; - EB_U64 cbCoeffBits = 0; - EB_U64 crCoeffBits = 0; + EB_U64 yCoeffBits; + EB_U64 cbCoeffBits = 0; + EB_U64 crCoeffBits = 0; LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuPtr->index]); const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(contextPtr->cuPtr->leafIndex); @@ -4382,10 +4382,10 @@ void PerformFullLoop( prevRootCbf = 1; bestfullCost = 0xFFFFFFFFull; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidate_t *candidatePtr; + ModeDecisionCandidate_t *candidatePtr; for (fullLoopCandidateIndex = 0; fullLoopCandidateIndex < fullCandidateTotalCount; ++fullLoopCandidateIndex) { @@ -4396,9 +4396,9 @@ void PerformFullLoop( yFullDistortion[DIST_CALC_PREDICTION] = 0; yCoeffBits = 0; - // Set the Candidate Buffer + // Set the Candidate Buffer candidateBuffer = candidateBufferPtrArray[candidateIndex]; - candidatePtr = candidateBuffer->candidatePtr;//this is the FastCandidateStruct + candidatePtr = candidateBuffer->candidatePtr;//this is the FastCandidateStruct candidatePtr->fullDistortion = 0; //CandBuff <-- CU @@ -4407,7 +4407,7 @@ void PerformFullLoop( candidatePtr->chromaDistortion = 0; candidatePtr->chromaDistortionInterDepth = 0; - + if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { if (candidatePtr->type == INTRA_MODE && prevRootCbf == 0) { continue; @@ -4550,8 +4550,8 @@ void PerformFullLoop( EB_U32 N4_TH[NUM_QPS] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; EB_U32 N2_TH[NUM_QPS] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - // EB_U32 tuSize = candidatePtr->transformSize; - // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; + // EB_U32 tuSize = candidatePtr->transformSize; + // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; EB_U32 correctedPFMode = contextPtr->pfMdMode; EB_U8 Weight; @@ -4604,8 +4604,8 @@ void PerformFullLoop( EB_U32 N4_TH[NUM_QPS] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; EB_U32 N2_TH[NUM_QPS] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - // EB_U32 tuSize = candidatePtr->transformSize; - // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; + // EB_U32 tuSize = candidatePtr->transformSize; + // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; EB_U32 correctedPFMode = contextPtr->pfMdMode; EB_U8 Weight; @@ -4668,7 +4668,7 @@ void PerformFullLoop( } } - if (contextPtr->fullLoopEscape) + if (contextPtr->fullLoopEscape) if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { if (candidatePtr->type == INTER_MODE) { @@ -4689,54 +4689,54 @@ void PerformFullLoop( * performs CL (LCU) *******************************************/ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - const MdcLcuData_t * const mdcResultTbPtr, - LargestCodingUnit_t *lcuPtr, - EB_U16 lcuOriginX, - EB_U16 lcuOriginY, - EB_U32 lcuAddr, - ModeDecisionContext_t *contextPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + const MdcLcuData_t * const mdcResultTbPtr, + LargestCodingUnit_t *lcuPtr, + EB_U16 lcuOriginX, + EB_U16 lcuOriginY, + EB_U32 lcuAddr, + ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - // CU - EB_U32 cuIdx; + // CU + EB_U32 cuIdx; - // Input + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U16 tileIdx = contextPtr->tileIndex; - // Mode Decision Candidate Buffers - EB_U32 bufferTotalCount; - ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; + // Mode Decision Candidate Buffers + EB_U32 bufferTotalCount; + ModeDecisionCandidateBuffer_t *candidateBuffer; + ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; - // Mode Decision Search Candidates - EB_U8 candidateIndex; - EB_U32 fastCandidateTotalCount; - EB_U32 fullCandidateTotalCount; + // Mode Decision Search Candidates + EB_U8 candidateIndex; + EB_U32 fastCandidateTotalCount; + EB_U32 fullCandidateTotalCount; - EB_U32 secondFastCostSearchCandidateTotalCount; + EB_U32 secondFastCostSearchCandidateTotalCount; - // CTB merge - EB_U32 lastCuIndex; + // CTB merge + EB_U32 lastCuIndex; - // Pre Intra Search - const EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, (EB_U32)(sequenceControlSetPtr->lumaHeight - lcuOriginY)); - const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - const EB_U32 leafCount = mdcResultTbPtr->leafCount; - const EbMdcLeafData_t *const leafDataArray = mdcResultTbPtr->leafDataArray; - ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; + // Pre Intra Search + const EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, (EB_U32)(sequenceControlSetPtr->lumaHeight - lcuOriginY)); + const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + const EB_U32 leafCount = mdcResultTbPtr->leafCount; + const EbMdcLeafData_t *const leafDataArray = mdcResultTbPtr->leafDataArray; + ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - EB_U32 maxBuffers; + EB_U32 maxBuffers; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; // enableExitPartitioning derivation @ ModeDecisionLcu() EB_BOOL enableExitPartitioning; @@ -4753,16 +4753,16 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } // Keep track of the LCU Ptr - contextPtr->lcuPtr = lcuPtr; - - contextPtr->groupOf8x8BlocksCount = 0; - contextPtr->groupOf16x16BlocksCount = 0; + contextPtr->lcuPtr = lcuPtr; + + contextPtr->groupOf8x8BlocksCount = 0; + contextPtr->groupOf16x16BlocksCount = 0; - ConstructMdCuArray( - contextPtr, - sequenceControlSetPtr, - lcuPtr, - mdcResultTbPtr); + ConstructMdCuArray( + contextPtr, + sequenceControlSetPtr, + lcuPtr, + mdcResultTbPtr); // Mode Decision Neighbor Arrays contextPtr->intraLumaModeNeighborArray = pictureControlSetPtr->mdIntraLumaModeNeighborArray[MD_NEIGHBOR_ARRAY_INDEX][tileIdx]; @@ -4774,26 +4774,26 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->cbReconNeighborArray = pictureControlSetPtr->mdCbReconNeighborArray[MD_NEIGHBOR_ARRAY_INDEX][tileIdx]; contextPtr->crReconNeighborArray = pictureControlSetPtr->mdCrReconNeighborArray[MD_NEIGHBOR_ARRAY_INDEX][tileIdx]; contextPtr->edgeBlockNumFlag = (EB_BOOL)pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuAddr].edgeBlockNum; - // First CU Loop - cuIdx = 0; - do - { - // Assign CU data - const EB_U8 leafIndex = leafDataArray[cuIdx].leafIndex; + // First CU Loop + cuIdx = 0; + do + { + // Assign CU data + const EB_U8 leafIndex = leafDataArray[cuIdx].leafIndex; - CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; + CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; - const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); + const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuOriginX = lcuOriginX + cuStatsPtr->originX; - contextPtr->cuOriginY = lcuOriginY + cuStatsPtr->originY; - const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); - const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); - const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); - const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; - const EbMdcLeafData_t * const leafDataPtr = &mdcResultTbPtr->leafDataArray[cuIdx]; + contextPtr->cuOriginY = lcuOriginY + cuStatsPtr->originY; + const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); + const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); + const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); + const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; + const EbMdcLeafData_t * const leafDataPtr = &mdcResultTbPtr->leafDataArray[cuIdx]; //need these for L7 Chroma: TBCleaned. contextPtr->cuDepth = cuStatsPtr->depth; @@ -4802,32 +4802,32 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->lcuChromaSize = contextPtr->lcuSize >> 1; contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; - contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; - contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; - cuPtr->leafIndex = leafIndex; - cuPtr->splitFlag = (EB_U16)( + contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; + contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; + cuPtr->leafIndex = leafIndex; + cuPtr->splitFlag = (EB_U16)( (sliceType == EB_I_PICTURE) && (cuStatsPtr->depth == 0) ? EB_TRUE : - leafDataPtr->splitFlag); + leafDataPtr->splitFlag); cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); - // Initialize Fast Loop - ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray - contextPtr, + // Initialize Fast Loop + ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray + contextPtr, contextPtr->intraLumaModeNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->leafDepthNeighborArray); + contextPtr->skipFlagNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->leafDepthNeighborArray); if ( - (pictureControlSetPtr->ParentPcsPtr->depthMode >= PICT_OPEN_LOOP_DEPTH_MODE || - (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_LIGHT_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_AVC_DEPTH_MODE))) && + (pictureControlSetPtr->ParentPcsPtr->depthMode >= PICT_OPEN_LOOP_DEPTH_MODE || + (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_LIGHT_OPEN_LOOP_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_AVC_DEPTH_MODE))) && lcuParams->isCompleteLcu ){ @@ -4840,7 +4840,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( // Perform MPM search if (contextPtr->mpmSearch) { - DeriveMpmModes( + DeriveMpmModes( contextPtr, cuPtr); } @@ -4860,7 +4860,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -4871,32 +4871,32 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->mostProbableModeArray); //if we want to recon N candidate, we would need N+1 buffers - maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); - - ProductPerformFastLoop( - pictureControlSetPtr, - lcuPtr, - contextPtr, - candidateBufferPtrArrayBase, - fastCandidateArray, - fastCandidateTotalCount, - inputPicturePtr, - inputOriginIndex, - inputCbOriginIndex, + maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); + + ProductPerformFastLoop( + pictureControlSetPtr, + lcuPtr, + contextPtr, + candidateBufferPtrArrayBase, + fastCandidateArray, + fastCandidateTotalCount, + inputPicturePtr, + inputOriginIndex, + inputCbOriginIndex, inputCbOriginIndex, cuPtr, - cuOriginIndex, - cuChromaOriginIndex, - maxBuffers, - &secondFastCostSearchCandidateTotalCount); + cuOriginIndex, + cuChromaOriginIndex, + maxBuffers, + &secondFastCostSearchCandidateTotalCount); - // Make sure bufferTotalCount is not larger than the number of fast modes - bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); + // Make sure bufferTotalCount is not larger than the number of fast modes + bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); - // PreModeDecision - // -Input is the buffers - // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + // PreModeDecision + // -Input is the buffers + // -Output is list of buffers for full reconstruction + EB_U8 disableMergeIndex = 0; PreModeDecision( @@ -4905,7 +4905,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -4918,21 +4918,21 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( inputCbOriginIndex, cuOriginIndex, cuChromaOriginIndex, - MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process + MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process - // Full Mode Decision (choose the best mode) - candidateIndex = ProductFullModeDecision( + // Full Mode Decision (choose the best mode) + candidateIndex = ProductFullModeDecision( contextPtr, - cuPtr, + cuPtr, contextPtr->cuStats->size, - candidateBufferPtrArray, - fullCandidateTotalCount, - contextPtr->bestCandidateIndexArray, - &bestIntraMode); + candidateBufferPtrArray, + fullCandidateTotalCount, + contextPtr->bestCandidateIndexArray, + &bestIntraMode); - // Set Candidate Buffer to the selected mode - // If Intra 4x4 is selected then candidateBuffer for depth 3 is not going to get used - // No MD-Recon: iTransform Loop + Recon, and no lumaReconSampleNeighborArray update + // Set Candidate Buffer to the selected mode + // If Intra 4x4 is selected then candidateBuffer for depth 3 is not going to get used + // No MD-Recon: iTransform Loop + Recon, and no lumaReconSampleNeighborArray update if (lcuPtr->intra4x4SearchMethod == INTRA4x4_INLINE_SEARCH) { @@ -4952,8 +4952,8 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } - candidateBuffer = candidateBufferPtrArray[candidateIndex]; - + candidateBuffer = candidateBufferPtrArray[candidateIndex]; + bestCandidateBuffers[contextPtr->cuStats->depth] = candidateBuffer; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yDc[0] = candidateBuffer->yDc[0]; @@ -4965,7 +4965,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) { contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; @@ -4975,9 +4975,9 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } - EB_U8 parentLeafIndex; + EB_U8 parentLeafIndex; - EB_BOOL exitPartition = EB_FALSE; + EB_BOOL exitPartition = EB_FALSE; contextPtr->mdLocalCuUnit[leafIndex].mdcArrayIndex = (EB_U8)cuIdx; CheckHighCostPartition( @@ -4989,26 +4989,26 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( enableExitPartitioning, &exitPartition); - if (exitPartition) - { - //Reset the CU-Loop to the parent CU. - cuStatsPtr = GetCodedUnitStats(parentLeafIndex); - cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; - cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; - cuPtr->splitFlag = EB_FALSE; - - lastCuIndex = ExitInterDepthDecision( - contextPtr, - parentLeafIndex, - lcuPtr, - lcuAddr, - lcuOriginX, - lcuOriginY, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - pictureControlSetPtr); - - } + if (exitPartition) + { + //Reset the CU-Loop to the parent CU. + cuStatsPtr = GetCodedUnitStats(parentLeafIndex); + cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; + cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; + cuPtr->splitFlag = EB_FALSE; + + lastCuIndex = ExitInterDepthDecision( + contextPtr, + parentLeafIndex, + lcuPtr, + lcuAddr, + lcuOriginX, + lcuOriginY, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + pictureControlSetPtr); + + } else { PerformInverseTransformRecon( @@ -5034,83 +5034,83 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } - if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) - { - // Update the CU Stats - contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); - contextPtr->cuOriginX = lcuOriginX + contextPtr->cuStats->originX; - contextPtr->cuOriginY = lcuOriginY + contextPtr->cuStats->originY; + if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) + { + // Update the CU Stats + contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); + contextPtr->cuOriginX = lcuOriginX + contextPtr->cuStats->originX; + contextPtr->cuOriginY = lcuOriginY + contextPtr->cuStats->originY; - // Set the MvUnit - contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; - contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; - contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; + // Set the MvUnit + contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; + contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; + contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; - // Set the candidate buffer - contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; - candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; + // Set the candidate buffer + contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; + candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; if (contextPtr->coeffCabacUpdate) EB_MEMCPY(&(contextPtr->latestValidCoeffCtxModel), &(candidateBuffer->candBuffCoeffCtxModel), sizeof(CoeffCtxtMdl_t)); - // Update Neighbor Arrays - { - EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; - EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; - EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; - - ModeDecisionUpdateNeighborArrays( - contextPtr->leafDepthNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->intraLumaModeNeighborArray, - contextPtr->mvNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - candidateBuffer->reconPtr, + // Update Neighbor Arrays + { + EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; + EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; + EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; + + ModeDecisionUpdateNeighborArrays( + contextPtr->leafDepthNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->intraLumaModeNeighborArray, + contextPtr->mvNeighborArray, + contextPtr->skipFlagNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + candidateBuffer->reconPtr, MAX_LCU_SIZE, - contextPtr->intraMdOpenLoopFlag, + contextPtr->intraMdOpenLoopFlag, (cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4), (EB_U8*)&contextPtr->cuStats->depth, - &predictionModeFlag, - &intraLumaMode, - &contextPtr->mvUnit, - &skipFlag, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuStats->size, + &predictionModeFlag, + &intraLumaMode, + &contextPtr->mvUnit, + &skipFlag, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - } - - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); - } - - } - - if (cuPtr->splitFlag == EB_TRUE){ - cuIdx++; - } - else if ( lcuHeight < MAX_LCU_SIZE) { - cuIdx++; - } - else{ - cuIdx += CalculateNextCuIndex( - leafDataArray, - cuIdx, - leafCount, + } + + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); + } + + } + + if (cuPtr->splitFlag == EB_TRUE){ + cuIdx++; + } + else if ( lcuHeight < MAX_LCU_SIZE) { + cuIdx++; + } + else{ + cuIdx += CalculateNextCuIndex( + leafDataArray, + cuIdx, + leafCount, cuStatsPtr->depth); } - } while (cuIdx < leafCount);// End of CU loop - return return_error; + } while (cuIdx < leafCount);// End of CU loop + return return_error; } void ConstructPillarCuArray( @@ -5130,38 +5130,38 @@ void ConstructPillarCuArray( CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[cuIndex]; splitFlag = EB_TRUE; - cuPtr->splitFlag = EB_TRUE; + cuPtr->splitFlag = EB_TRUE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; if (lcuParamPtr->rasterScanCuValidity[MD_SCAN_TO_RASTER_SCAN[cuIndex]]) { if (cuStatsPtr->depth == 0) { splitFlag = EB_TRUE; - cuPtr->splitFlag = EB_TRUE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; } else if (cuStatsPtr->depth == 1 && contextPtr->depthRefinment < 2 && pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuPtr->index] != LCU_COMPLEXITY_STATUS_2) { splitFlag = EB_TRUE; - cuPtr->splitFlag = EB_TRUE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; contextPtr->pillarCuArray.leafDataArray[contextPtr->pillarCuArray.leafCount] = cuIndex; contextPtr->pillarCuArray.leafCount++; } else if (cuStatsPtr->depth == 2) { - + splitFlag = EB_FALSE; - cuPtr->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; contextPtr->pillarCuArray.leafDataArray[contextPtr->pillarCuArray.leafCount] = cuIndex; contextPtr->pillarCuArray.leafCount++; } else if (cuStatsPtr->depth == 3) { splitFlag = EB_FALSE; - cuPtr->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; contextPtr->pillarCuArray.leafDataArray[contextPtr->pillarCuArray.leafCount] = cuIndex; contextPtr->pillarCuArray.leafCount++; @@ -5176,46 +5176,46 @@ void ConstructPillarCuArray( EB_EXTERN EB_ERRORTYPE BdpPillar( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - // CU - EB_U32 cuIdx; + EB_ERRORTYPE return_error = EB_ErrorNone; - // Input + // CU + EB_U32 cuIdx; + + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U16 tileIdx = lcuPtr->lcuEdgeInfoPtr->tileIndexInRaster; - // Mode Decision Candidate Buffers - EB_U32 bufferTotalCount; - ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; + // Mode Decision Candidate Buffers + EB_U32 bufferTotalCount; + ModeDecisionCandidateBuffer_t *candidateBuffer; + ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; + + // Mode Decision Search Candidates + EB_U8 candidateIndex; + EB_U32 fastCandidateTotalCount; + EB_U32 fullCandidateTotalCount; + + EB_U32 secondFastCostSearchCandidateTotalCount; + + // CTB merge + EB_U32 lastCuIndex; - // Mode Decision Search Candidates - EB_U8 candidateIndex; - EB_U32 fastCandidateTotalCount; - EB_U32 fullCandidateTotalCount; + // Pre Intra Search - EB_U32 secondFastCostSearchCandidateTotalCount; - - // CTB merge - EB_U32 lastCuIndex; - - // Pre Intra Search + ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; - ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - EB_U32 maxBuffers; + EB_U32 maxBuffers; // enableExitPartitioning derivation @ BdpPillar() @@ -5230,10 +5230,10 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->cu8x8RefinementOnFlag = EB_FALSE; // Keep track of the LCU Ptr - contextPtr->lcuPtr = lcuPtr; - - contextPtr->groupOf8x8BlocksCount = 0; - contextPtr->groupOf16x16BlocksCount = 0; + contextPtr->lcuPtr = lcuPtr; + + contextPtr->groupOf8x8BlocksCount = 0; + contextPtr->groupOf16x16BlocksCount = 0; // Mode Decision Neighbor Arrays contextPtr->intraLumaModeNeighborArray = pictureControlSetPtr->mdIntraLumaModeNeighborArray[PILLAR_NEIGHBOR_ARRAY_INDEX][tileIdx]; @@ -5247,26 +5247,26 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->edgeBlockNumFlag = (EB_BOOL)pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuAddr].edgeBlockNum; - // First CU Loop - cuIdx = 0; - do - { - // Assign CU data + // First CU Loop + cuIdx = 0; + do + { + // Assign CU data const EB_U8 leafIndex = contextPtr->pillarCuArray.leafDataArray[cuIdx]; - CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; + CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; - const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); + const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuOriginX = lcuParamPtr->originX + cuStatsPtr->originX; - contextPtr->cuOriginY = lcuParamPtr->originY + cuStatsPtr->originY; - const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); - const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); - const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); - const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; + contextPtr->cuOriginY = lcuParamPtr->originY + cuStatsPtr->originY; + const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); + const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); + const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); + const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; //need these for L7 Chroma: TBCleaned. contextPtr->cuDepth = cuStatsPtr->depth; @@ -5275,32 +5275,32 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->lcuChromaSize = contextPtr->lcuSize >> 1; contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; - contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; - contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; - cuPtr->leafIndex = leafIndex; + contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; + contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; + cuPtr->leafIndex = leafIndex; cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); - - // Initialize Fast Loop - ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray - contextPtr, + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); + + // Initialize Fast Loop + ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray + contextPtr, contextPtr->intraLumaModeNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->leafDepthNeighborArray); + contextPtr->skipFlagNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->leafDepthNeighborArray); - // Perform MPM search - if (contextPtr->mpmSearch) { + // Perform MPM search + if (contextPtr->mpmSearch) { DeriveMpmModes( // HT done contextPtr, cuPtr); - } + } SetNmm( contextPtr, @@ -5314,47 +5314,47 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->conformantMvMergeTable = EB_TRUE; - ProductGenerateAmvpMergeInterIntraMdCandidatesCU( - lcuPtr, - contextPtr, - leafIndex, - lcuAddr, - &bufferTotalCount, - &fastCandidateTotalCount, - (void*)contextPtr->interPredictionContext, - pictureControlSetPtr, - contextPtr->mpmSearch, - contextPtr->mpmSearchCandidate, - contextPtr->mostProbableModeArray); + ProductGenerateAmvpMergeInterIntraMdCandidatesCU( + lcuPtr, + contextPtr, + leafIndex, + lcuAddr, + &bufferTotalCount, + &fastCandidateTotalCount, + (void*)contextPtr->interPredictionContext, + pictureControlSetPtr, + contextPtr->mpmSearch, + contextPtr->mpmSearchCandidate, + contextPtr->mostProbableModeArray); //if we want to recon N candidate, we would need N+1 buffers - maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); - - ProductPerformFastLoop( - pictureControlSetPtr, - lcuPtr, - contextPtr, - candidateBufferPtrArrayBase, - fastCandidateArray, - fastCandidateTotalCount, - inputPicturePtr, - inputOriginIndex, - inputCbOriginIndex, + maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); + + ProductPerformFastLoop( + pictureControlSetPtr, + lcuPtr, + contextPtr, + candidateBufferPtrArrayBase, + fastCandidateArray, + fastCandidateTotalCount, + inputPicturePtr, + inputOriginIndex, + inputCbOriginIndex, inputCbOriginIndex, cuPtr, - cuOriginIndex, - cuChromaOriginIndex, - maxBuffers, - &secondFastCostSearchCandidateTotalCount); + cuOriginIndex, + cuChromaOriginIndex, + maxBuffers, + &secondFastCostSearchCandidateTotalCount); - // Make sure bufferTotalCount is not larger than the number of fast modes - bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); + // Make sure bufferTotalCount is not larger than the number of fast modes + bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); - // PreModeDecision - // -Input is the buffers - // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + // PreModeDecision + // -Input is the buffers + // -Output is list of buffers for full reconstruction + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -5362,10 +5362,10 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only - PerformFullLoop( + PerformFullLoop( pictureControlSetPtr, lcuPtr, cuPtr, @@ -5375,20 +5375,20 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( inputCbOriginIndex, cuOriginIndex, cuChromaOriginIndex, - MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process + MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process - // Full Mode Decision (choose the best mode) - candidateIndex = ProductFullModeDecision( + // Full Mode Decision (choose the best mode) + candidateIndex = ProductFullModeDecision( contextPtr, - cuPtr, + cuPtr, contextPtr->cuStats->size, - candidateBufferPtrArray, - fullCandidateTotalCount, - contextPtr->bestCandidateIndexArray, - &bestIntraMode); + candidateBufferPtrArray, + fullCandidateTotalCount, + contextPtr->bestCandidateIndexArray, + &bestIntraMode); + + candidateBuffer = candidateBufferPtrArray[candidateIndex]; - candidateBuffer = candidateBufferPtrArray[candidateIndex]; - bestCandidateBuffers[contextPtr->cuStats->depth] = candidateBuffer; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yDc[0] = candidateBuffer->yDc[0]; @@ -5409,11 +5409,11 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; } - EB_U8 parentLeafIndex; - EB_BOOL exitPartition = EB_FALSE; - contextPtr->mdLocalCuUnit[leafIndex].mdcArrayIndex = (EB_U8)cuIdx; - - CheckHighCostPartition( + EB_U8 parentLeafIndex; + EB_BOOL exitPartition = EB_FALSE; + contextPtr->mdLocalCuUnit[leafIndex].mdcArrayIndex = (EB_U8)cuIdx; + + CheckHighCostPartition( sequenceControlSetPtr, contextPtr, lcuPtr, @@ -5422,123 +5422,123 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( enableExitPartitioning, &exitPartition); - if (exitPartition) - { - //Reset the CU-Loop to the parent CU. - cuStatsPtr = GetCodedUnitStats(parentLeafIndex); - cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; - cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; - cuPtr->splitFlag = EB_FALSE; - - lastCuIndex = ExitInterDepthDecision( - contextPtr, - parentLeafIndex, - lcuPtr, - lcuAddr, - lcuParamPtr->originX, - lcuParamPtr->originY, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - pictureControlSetPtr); - - } - else{ + if (exitPartition) + { + //Reset the CU-Loop to the parent CU. + cuStatsPtr = GetCodedUnitStats(parentLeafIndex); + cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; + cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; + cuPtr->splitFlag = EB_FALSE; + + lastCuIndex = ExitInterDepthDecision( + contextPtr, + parentLeafIndex, + lcuPtr, + lcuAddr, + lcuParamPtr->originX, + lcuParamPtr->originY, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + pictureControlSetPtr); + + } + else{ PerformInverseTransformRecon( contextPtr, candidateBuffer, cuPtr, contextPtr->cuStats); - // Inter Depth Decision - lastCuIndex = PillarInterDepthDecision( - contextPtr, - leafIndex, - lcuPtr, - lcuParamPtr->originX, - lcuParamPtr->originY, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - pictureControlSetPtr); - } - - if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) - { - // Update the CU Stats - contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); - contextPtr->cuOriginX = lcuParamPtr->originX + contextPtr->cuStats->originX; - contextPtr->cuOriginY = lcuParamPtr->originY + contextPtr->cuStats->originY; - - // Set the MvUnit - contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; - contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; - contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; - - // Set the candidate buffer - contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; - candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; - - // Update Neighbor Arrays - { - EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; - EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; - EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; - - ModeDecisionUpdateNeighborArrays( - contextPtr->leafDepthNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->intraLumaModeNeighborArray, - contextPtr->mvNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - candidateBuffer->reconPtr, + // Inter Depth Decision + lastCuIndex = PillarInterDepthDecision( + contextPtr, + leafIndex, + lcuPtr, + lcuParamPtr->originX, + lcuParamPtr->originY, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + pictureControlSetPtr); + } + + if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) + { + // Update the CU Stats + contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); + contextPtr->cuOriginX = lcuParamPtr->originX + contextPtr->cuStats->originX; + contextPtr->cuOriginY = lcuParamPtr->originY + contextPtr->cuStats->originY; + + // Set the MvUnit + contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; + contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; + contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; + + // Set the candidate buffer + contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; + candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; + + // Update Neighbor Arrays + { + EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; + EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; + EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; + + ModeDecisionUpdateNeighborArrays( + contextPtr->leafDepthNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->intraLumaModeNeighborArray, + contextPtr->mvNeighborArray, + contextPtr->skipFlagNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + candidateBuffer->reconPtr, MAX_LCU_SIZE, contextPtr->intraMdOpenLoopFlag, EB_FALSE, - (EB_U8*)&contextPtr->cuStats->depth, - &predictionModeFlag, - &intraLumaMode, - &contextPtr->mvUnit, - &skipFlag, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuStats->size, + (EB_U8*)&contextPtr->cuStats->depth, + &predictionModeFlag, + &intraLumaMode, + &contextPtr->mvUnit, + &skipFlag, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - } + } - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->pillarReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->pillarReconBuffer, + contextPtr, + lcuPtr); + } + } - if (exitPartition == EB_FALSE){ - cuIdx++; - } - else{ - cuIdx += BdpCalculateNextCuIndex( - contextPtr->pillarCuArray.leafDataArray, - cuIdx, - contextPtr->pillarCuArray.leafCount, - cuStatsPtr->depth); - } + if (exitPartition == EB_FALSE){ + cuIdx++; + } + else{ + cuIdx += BdpCalculateNextCuIndex( + contextPtr->pillarCuArray.leafDataArray, + cuIdx, + contextPtr->pillarCuArray.leafCount, + cuStatsPtr->depth); + } - } while (cuIdx < contextPtr->pillarCuArray.leafCount); + } while (cuIdx < contextPtr->pillarCuArray.leafCount); - return return_error; -} + return return_error; +} void SplitParentCu( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr, EB_U8 parentLeafIndex, EB_U64 totalChildCost, @@ -5554,13 +5554,13 @@ void SplitParentCu( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborMode; - contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborDepth; - contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborMode; - contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborDepth; + contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborMode; + contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborDepth; + contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborMode; + contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborDepth; // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, lcuPtr->codedLeafArrayPtr[parentLeafIndex], 0, &depthNRate, @@ -5568,10 +5568,10 @@ void SplitParentCu( mdRateEstimationPtr, 3); //tbMaxDepth); - *depthNCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; + *depthNCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; // Compute depth N+1 cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, lcuPtr->codedLeafArrayPtr[parentLeafIndex], 1, &depthNPlusOneRate, @@ -5591,7 +5591,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( { EB_ERRORTYPE return_error = EB_ErrorNone; - // Input + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; // Mode Decision Candidate Buffers @@ -5599,18 +5599,18 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( ModeDecisionCandidateBuffer_t *candidateBuffer; ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; - // Mode Decision Search Candidates + // Mode Decision Search Candidates EB_U8 candidateIndex; EB_U32 fastCandidateTotalCount; EB_U32 fullCandidateTotalCount; EB_U32 secondFastCostSearchCandidateTotalCount; - // Pre Intra Search + // Pre Intra Search ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; EB_U32 maxBuffers; @@ -5654,9 +5654,9 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); // Initialize Fast Loop ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray @@ -5688,7 +5688,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -5724,7 +5724,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( // PreModeDecision // -Input is the buffers // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -5732,7 +5732,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -5745,7 +5745,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( inputCbOriginIndex, cuOriginIndex, cuChromaOriginIndex, - MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process + MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process // Full Mode Decision (choose the best mode) candidateIndex = ProductFullModeDecision( @@ -5769,7 +5769,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) { contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; @@ -5786,10 +5786,10 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( EB_U64 depthNCost = 0; EB_U64 depthNPlusOneCost = 0; - EB_U64 totalChildCost = contextPtr->mdLocalCuUnit[1].cost + contextPtr->mdLocalCuUnit[22].cost + contextPtr->mdLocalCuUnit[43].cost + contextPtr->mdLocalCuUnit[64].cost; + EB_U64 totalChildCost = contextPtr->mdLocalCuUnit[1].cost + contextPtr->mdLocalCuUnit[22].cost + contextPtr->mdLocalCuUnit[43].cost + contextPtr->mdLocalCuUnit[64].cost; - SplitParentCu( - contextPtr, + SplitParentCu( + contextPtr, lcuPtr, 0, totalChildCost, @@ -5844,15 +5844,15 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->pillarReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->pillarReconBuffer, + contextPtr, + lcuPtr); + } + } return return_error; @@ -5862,14 +5862,14 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( SequenceControlSet_t *sequenceControlSetPtr, PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; - // Input + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U16 tileIdx = contextPtr->tileIndex; @@ -5878,32 +5878,32 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( EB_U32 bufferTotalCount; ModeDecisionCandidateBuffer_t *candidateBuffer; ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH] = {NULL}; - - // Mode Decision Search Candidates + + // Mode Decision Search Candidates EB_U8 candidateIndex; EB_U32 fastCandidateTotalCount; EB_U32 fullCandidateTotalCount; EB_U32 secondFastCostSearchCandidateTotalCount; - // Pre Intra Search + // Pre Intra Search ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; EB_U32 maxBuffers; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuPtr->index]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuPtr->index]; // enableExitPartitioning derivation @ Bdp16x16vs8x8RefinementProcess() EB_BOOL enableExitPartitioning = (contextPtr->enableExitPartitioning && lcuParams->isCompleteLcu) ? EB_TRUE : EB_FALSE; // Keep track of the LCU Ptr - contextPtr->lcuPtr = lcuPtr; + contextPtr->lcuPtr = lcuPtr; contextPtr->intraLumaModeNeighborArray = pictureControlSetPtr->mdIntraLumaModeNeighborArray[REFINEMENT_NEIGHBOR_ARRAY_INDEX][tileIdx]; contextPtr->mvNeighborArray = pictureControlSetPtr->mdMvNeighborArray[REFINEMENT_NEIGHBOR_ARRAY_INDEX][tileIdx]; @@ -5915,16 +5915,16 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->crReconNeighborArray = pictureControlSetPtr->mdCrReconNeighborArray[REFINEMENT_NEIGHBOR_ARRAY_INDEX][tileIdx]; EB_U8 parentLeafIndex = 0; - + while (parentLeafIndex < CU_MAX_COUNT) { if (lcuPtr->codedLeafArrayPtr[parentLeafIndex]->splitFlag == EB_FALSE) { EB_U8 parentDepthOffset = DepthOffset[GetCodedUnitStats(parentLeafIndex)->depth]; EB_U8 childDepthOffset = DepthOffset[GetCodedUnitStats(parentLeafIndex)->depth + 1]; - EB_BOOL cu16x16RefinementFlag; + EB_BOOL cu16x16RefinementFlag; - if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LIGHT_BDP_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_LIGHT_BDP_DEPTH_MODE))){ + if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LIGHT_BDP_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_LIGHT_BDP_DEPTH_MODE))){ cu16x16RefinementFlag = GetCodedUnitStats(parentLeafIndex)->size == 16 && (lcuPtr->codedLeafArrayPtr[parentLeafIndex]->predictionModeFlag == INTRA_MODE || contextPtr->depthRefinment > 0); @@ -5948,23 +5948,23 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( leafIndexArray[2] = parentLeafIndex + 1 + childDepthOffset * 2; leafIndexArray[3] = parentLeafIndex + 1 + childDepthOffset * 3; - - EB_BOOL exitPartition = EB_FALSE; - EB_U64 cu16x16Cost = MAX_CU_COST; - if (enableExitPartitioning) - { - EB_U64 depth2Rate; - SplitFlagRate( - contextPtr, - lcuPtr->codedLeafArrayPtr[parentLeafIndex], - 0, - &depth2Rate, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - 3); //tbMaxDepth); //CHKN THIS SHOULD BE 4 - keep 3 to be consistent with BDP usage - - cu16x16Cost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depth2Rate; - } + + EB_BOOL exitPartition = EB_FALSE; + EB_U64 cu16x16Cost = MAX_CU_COST; + if (enableExitPartitioning) + { + EB_U64 depth2Rate; + SplitFlagRate( + contextPtr, + lcuPtr->codedLeafArrayPtr[parentLeafIndex], + 0, + &depth2Rate, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + 3); //tbMaxDepth); //CHKN THIS SHOULD BE 4 - keep 3 to be consistent with BDP usage + + cu16x16Cost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depth2Rate; + } for (leafCount = 0; leafCount < totalLeafCount; leafCount++) { @@ -5992,15 +5992,15 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; - contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; + contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; cuPtr->leafIndex = leafIndex; cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); - // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + // Set PF Mode - should be done per TU (and not per CU) to avoid the correction + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); // Initialize Fast Loop ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray @@ -6031,7 +6031,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -6068,7 +6068,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( // PreModeDecision // -Input is the buffers // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -6076,7 +6076,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -6089,7 +6089,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( inputCbOriginIndex, cuOriginIndex, cuChromaOriginIndex, - MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process + MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process // Full Mode Decision (choose the best mode) candidateIndex = ProductFullModeDecision( @@ -6113,35 +6113,35 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) - { - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; - } - - PerformInverseTransformRecon( - contextPtr, - candidateBuffer, - cuPtr, - contextPtr->cuStats); + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + { + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; + } + + PerformInverseTransformRecon( + contextPtr, + candidateBuffer, + cuPtr, + contextPtr->cuStats); if (leafCount < 4) { - totalChildCost += contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost; + totalChildCost += contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost; neighborLeafIndex = leafIndex; } - - if (enableExitPartitioning){ - if (leafCount < 3 && totalChildCost > cu16x16Cost && lcuParams->isCompleteLcu) - { - exitPartition = EB_TRUE; - neighborLeafIndex = parentLeafIndex; - } - } + + if (enableExitPartitioning){ + if (leafCount < 3 && totalChildCost > cu16x16Cost && lcuParams->isCompleteLcu) + { + exitPartition = EB_TRUE; + neighborLeafIndex = parentLeafIndex; + } + } if (leafCount == (totalLeafCount - 1)){ @@ -6149,10 +6149,10 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( EB_U64 depthNCost = 0; EB_U64 depthNPlusOneCost = 0; - parentLeafIndex = (parentLeafIndex == (CU_MAX_COUNT - 1)) ? CU_MAX_COUNT - 5 : parentLeafIndex; - - SplitParentCu( - contextPtr, + parentLeafIndex = (parentLeafIndex == (CU_MAX_COUNT - 1)) ? CU_MAX_COUNT - 5 : parentLeafIndex; + + SplitParentCu( + contextPtr, lcuPtr, parentLeafIndex, totalChildCost, @@ -6168,9 +6168,9 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( lcuPtr->codedLeafArrayPtr[parentLeafIndex + 1 + childDepthOffset]->splitFlag = EB_FALSE; lcuPtr->codedLeafArrayPtr[parentLeafIndex + 1 + childDepthOffset * 2]->splitFlag = EB_FALSE; lcuPtr->codedLeafArrayPtr[parentLeafIndex + 1 + childDepthOffset * 3]->splitFlag = EB_FALSE; - + contextPtr->cu8x8RefinementOnFlag = EB_TRUE; - + } else { neighborLeafIndex = parentLeafIndex; @@ -6203,7 +6203,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->pillarReconBuffer : candidateBuffer->reconPtr ; - ModeDecisionUpdateNeighborArrays( + ModeDecisionUpdateNeighborArrays( contextPtr->leafDepthNeighborArray, contextPtr->modeTypeNeighborArray, contextPtr->intraLumaModeNeighborArray, @@ -6226,20 +6226,20 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - reconBuffer, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + reconBuffer, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); + } + } - if (exitPartition == EB_TRUE){ - break; - } + if (exitPartition == EB_TRUE){ + break; + } } @@ -6265,7 +6265,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; - Bdp16x16vs8x8RefinementUpdateNeighborArrays( + Bdp16x16vs8x8RefinementUpdateNeighborArrays( pictureControlSetPtr, contextPtr->leafDepthNeighborArray, @@ -6291,15 +6291,15 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( tileIdx, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - contextPtr->pillarReconBuffer, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + contextPtr->pillarReconBuffer, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); + } + } parentLeafIndex += parentDepthOffset; @@ -6307,7 +6307,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( parentLeafIndex++; } - } + } return return_error; } @@ -6321,26 +6321,26 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( { EB_ERRORTYPE return_error = EB_ErrorNone; - // Input + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; // Mode Decision Candidate Buffers EB_U32 bufferTotalCount; ModeDecisionCandidateBuffer_t *candidateBuffer; ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH] = {NULL}; - - // Mode Decision Search Candidates + + // Mode Decision Search Candidates EB_U8 candidateIndex; EB_U32 fastCandidateTotalCount; EB_U32 fullCandidateTotalCount; EB_U32 secondFastCostSearchCandidateTotalCount; - // Pre Intra Search + // Pre Intra Search ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; EB_U32 maxBuffers; @@ -6358,7 +6358,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( contextPtr->cbReconNeighborArray = pictureControlSetPtr->mdCbReconNeighborArray[MV_MERGE_PASS_NEIGHBOR_ARRAY_INDEX][tileIdx]; contextPtr->crReconNeighborArray = pictureControlSetPtr->mdCrReconNeighborArray[MV_MERGE_PASS_NEIGHBOR_ARRAY_INDEX][tileIdx]; - // First CU Loop + // First CU Loop EB_U8 leafIndex = 0; while (leafIndex < CU_MAX_COUNT) { @@ -6388,15 +6388,15 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( contextPtr->lcuChromaSize = contextPtr->lcuSize >> 1; contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; - contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; + contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; cuPtr->leafIndex = leafIndex; cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); - // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + // Set PF Mode - should be done per TU (and not per CU) to avoid the correction + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); // Initialize Fast Loop ProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray @@ -6413,8 +6413,8 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( cuPtr); } - SetNmm( - contextPtr, + SetNmm( + contextPtr, BDP_MVMERGE_STAGE); SetNfl( @@ -6428,7 +6428,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -6465,7 +6465,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( // PreModeDecision // -Input is the buffers // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -6473,7 +6473,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -6486,7 +6486,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( inputCbOriginIndex, cuOriginIndex, cuChromaOriginIndex, - MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process + MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process // Full Mode Decision (choose the best mode) candidateIndex = ProductFullModeDecision( @@ -6512,14 +6512,14 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) - { - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; - } + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + { + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; + } PerformInverseTransformRecon( contextPtr, @@ -6545,7 +6545,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; - + MvMergePassUpdateNeighborArrays( pictureControlSetPtr, contextPtr->leafDepthNeighborArray, @@ -6570,18 +6570,18 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( tileIdx, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); - } + } - } + } else { // Update the CU Stats diff --git a/Source/Lib/Codec/EbRateControlResults.h b/Source/Lib/Codec/EbRateControlResults.h index fc82ed909..1effdd66f 100644 --- a/Source/Lib/Codec/EbRateControlResults.h +++ b/Source/Lib/Codec/EbRateControlResults.h @@ -18,7 +18,7 @@ extern "C" { typedef struct RateControlResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; - + } RateControlResults_t; typedef struct RateControlResultsInitData_s @@ -30,11 +30,11 @@ typedef struct RateControlResultsInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE RateControlResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus } #endif -#endif // EbRateControlResults_h \ No newline at end of file +#endif // EbRateControlResults_h diff --git a/Source/Lib/Codec/EbRateControlTables.c b/Source/Lib/Codec/EbRateControlTables.c index 9be010a5c..d2893cd7a 100644 --- a/Source/Lib/Codec/EbRateControlTables.c +++ b/Source/Lib/Codec/EbRateControlTables.c @@ -4,1863 +4,1863 @@ */ #include "EbRateControlTables.h" -static const EB_Bit_Number initialRateControlSad64x64Tables[] = { - // QP = 0 NEW - 0, 0, 0, 0, - 0, 0, 19064, 21410, - 21781, 22938, 23734, 24222, - 24242, 24233, 24377, 26487, - 26950, 28615, 29670, 29941, - 29857, 29336, 29130, 29572, - 29583, 29507, 29359, 29711, - 29789, 29753, 29766, 29528, - 29487, 29511, 29611, 29756, - 29758, 29933, 30202, 30579, - 30618, 30870, 31006, 31339, - 31364, 31566, 31687, 31982, - 32063, 32155, 32396, 32551, - 32640, 32651, 32787, 32978, - 32923, 33063, 33139, 33235, - 33288, 33350, 33382, 34440, - // QP = 1 NEW - 0, 0, 0, 0, - 0, 0, 18221, 20496, - 20860, 21997, 22789, 23260, - 23283, 23277, 23417, 25456, - 25906, 27517, 28544, 28819, - 28739, 28240, 28046, 28479, - 28492, 28419, 28277, 28619, - 28697, 28662, 28675, 28443, - 28404, 28427, 28526, 28669, - 28671, 28841, 29104, 29474, - 29512, 29758, 29891, 30218, - 30243, 30439, 30558, 30847, - 30927, 31019, 31253, 31404, - 31492, 31504, 31635, 31824, - 31767, 31908, 31983, 32076, - 32126, 32187, 32217, 33261, - // QP = 2 NEW - 0, 0, 0, 0, - 0, 0, 17109, 19287, - 19632, 20731, 21499, 21947, - 21966, 21954, 22094, 24133, - 24583, 26189, 27209, 27477, - 27395, 26896, 26700, 27132, - 27142, 27071, 26926, 27266, - 27342, 27305, 27318, 27087, - 27048, 27072, 27169, 27312, - 27313, 27485, 27746, 28114, - 28151, 28395, 28528, 28851, - 28878, 29072, 29189, 29478, - 29557, 29647, 29879, 30031, - 30118, 30128, 30259, 30446, - 30389, 30528, 30601, 30694, - 30746, 30806, 30837, 31865, - // QP = 3 NEW - 0, 0, 0, 0, - 0, 0, 16145, 18267, - 18604, 19688, 20447, 20882, - 20904, 20894, 21032, 23054, - 23498, 25089, 26096, 26357, - 26277, 25781, 25590, 26017, - 26029, 25959, 25818, 26156, - 26232, 26196, 26208, 25979, - 25939, 25963, 26059, 26201, - 26202, 26371, 26629, 26993, - 27030, 27271, 27404, 27723, - 27751, 27942, 28058, 28343, - 28421, 28510, 28740, 28892, - 28977, 28987, 29117, 29301, - 29246, 29381, 29456, 29546, - 29596, 29656, 29687, 30703, - // QP = 4 NEW - 0, 0, 0, 0, - 0, 0, 14466, 16764, - 17121, 18263, 19044, 19493, - 19515, 19505, 19640, 21686, - 22138, 23742, 24755, 25011, - 24929, 24429, 24236, 24666, - 24677, 24609, 24468, 24812, - 24888, 24855, 24869, 24642, - 24603, 24628, 24726, 24869, - 24871, 25041, 25302, 25665, - 25703, 25944, 26077, 26400, - 26424, 26617, 26734, 27020, - 27096, 27186, 27416, 27566, - 27651, 27663, 27794, 27979, - 27922, 28058, 28132, 28222, - 28273, 28332, 28363, 29381, - // QP = 5 NEW - 0, 0, 0, 0, - 0, 0, 13448, 15643, - 16002, 17119, 17892, 18326, - 18349, 18336, 18472, 20515, - 20962, 22564, 23574, 23823, - 23740, 23238, 23043, 23466, - 23475, 23407, 23267, 23607, - 23683, 23650, 23666, 23441, - 23404, 23430, 23527, 23671, - 23673, 23842, 24099, 24461, - 24497, 24738, 24869, 25189, - 25214, 25405, 25520, 25804, - 25880, 25970, 26197, 26346, - 26430, 26441, 26571, 26752, - 26698, 26831, 26906, 26996, - 27046, 27104, 27136, 28145, - // QP = 6 - 0, 0, 0, 0, - 0, 0, 11823, 14174, - 14548, 15711, 16489, 16927, - 16944, 16927, 17066, 19162, - 19624, 21263, 22292, 22541, - 22456, 21939, 21736, 22163, - 22174, 22098, 21956, 22298, - 22374, 22342, 22357, 22134, - 22094, 22122, 22222, 22367, - 22370, 22543, 22805, 23170, - 23208, 23451, 23584, 23907, - 23931, 24126, 24243, 24529, - 24606, 24694, 24925, 25075, - 25161, 25172, 25302, 25486, - 25428, 25564, 25640, 25729, - 25779, 25838, 25869, 26882, - // QP = 7 NEW - 0, 0, 0, 0, - 0, 0, 11047, 13263, - 13626, 14758, 15535, 15968, - 15989, 15973, 16111, 18171, - 18622, 20229, 21240, 21487, - 21403, 20895, 20697, 21116, - 21125, 21054, 20913, 21248, - 21322, 21290, 21305, 21086, - 21049, 21078, 21178, 21322, - 21325, 21495, 21752, 22112, - 22148, 22387, 22519, 22836, - 22860, 23051, 23166, 23447, - 23522, 23611, 23836, 23984, - 24068, 24079, 24208, 24387, - 24332, 24466, 24537, 24627, - 24677, 24735, 24764, 25766, - // QP = 8 NEW - 0, 0, 0, 0, - 0, 0, 9513, 11784, - 12142, 13291, 14070, 14500, - 14519, 14503, 14642, 16742, - 17200, 18832, 19854, 20099, - 20014, 19498, 19297, 19720, - 19731, 19657, 19515, 19853, - 19926, 19893, 19907, 19687, - 19649, 19679, 19780, 19927, - 19930, 20102, 20362, 20726, - 20763, 21005, 21136, 21458, - 21482, 21675, 21791, 22074, - 22150, 22239, 22467, 22616, - 22699, 22712, 22840, 23022, - 22965, 23100, 23173, 23262, - 23313, 23371, 23401, 24404, - // QP = 9 - 0, 0, 0, 0, - 0, 0, 8757, 10863, - 11200, 12284, 13028, 13441, - 13460, 13449, 13589, 15669, - 16127, 17751, 18769, 19008, - 18923, 18408, 18205, 18625, - 18634, 18561, 18418, 18753, - 18828, 18795, 18807, 18587, - 18548, 18575, 18676, 18822, - 18826, 18997, 19255, 19619, - 19654, 19896, 20028, 20348, - 20372, 20564, 20679, 20963, - 21037, 21126, 21353, 21502, - 21584, 21596, 21725, 21906, - 21850, 21983, 22057, 22147, - 22195, 22254, 22284, 23283, - // QP = 10 NEW - - 0, 0, 0, 0, - 0, 0, 7397, 9510, - 9849, 10958, 11724, 12152, - 12174, 12162, 12304, 14418, - 14880, 16525, 17551, 17785, - 17697, 17172, 16963, 17382, - 17391, 17317, 17173, 17510, - 17585, 17553, 17566, 17348, - 17308, 17339, 17440, 17588, - 17592, 17764, 18025, 18389, - 18425, 18667, 18799, 19121, - 19145, 19337, 19453, 19735, - 19811, 19901, 20127, 20276, - 20361, 20370, 20500, 20680, - 20624, 20757, 20830, 20920, - 20969, 21028, 21057, 22059, - // QP = 11 NEW - 0, 0, 0, 0, - 0, 0, 6115, 8119, - 8448, 9531, 10277, 10703, - 10726, 10716, 10862, 13003, - 13473, 15143, 16186, 16425, - 16335, 15800, 15587, 16006, - 16015, 15936, 15787, 16125, - 16201, 16167, 16181, 15959, - 15919, 15949, 16052, 16201, - 16205, 16379, 16643, 17012, - 17049, 17293, 17427, 17753, - 17775, 17971, 18089, 18375, - 18449, 18540, 18769, 18922, - 19006, 19015, 19146, 19329, - 19273, 19408, 19481, 19571, - 19620, 19679, 19709, 20724, - - // QP = 12 NEW - 0, 0, 0, 0, - 0, 0, 5252, 7138, - 7459, 8506, 9229, 9649, - 9671, 9663, 9813, 11944, - 12414, 14077, 15119, 15365, - 15276, 14745, 14532, 14951, - 14960, 14880, 14730, 15065, - 15140, 15105, 15117, 14895, - 14855, 14885, 14988, 15136, - 15139, 15314, 15578, 15944, - 15982, 16227, 16360, 16686, - 16709, 16904, 17022, 17309, - 17384, 17473, 17705, 17854, - 17939, 17949, 18080, 18263, - 18206, 18341, 18416, 18505, - 18554, 18613, 18644, 19661, - - // QP = 13 NEW - 0, 0, 0, 0, - 0, 0, 4362, 6083, - 6381, 7376, 8070, 8477, - 8501, 8497, 8654, 10759, - 11223, 12872, 13908, 14159, - 14073, 13550, 13343, 13759, - 13770, 13689, 13539, 13871, - 13947, 13909, 13919, 13694, - 13653, 13681, 13782, 13927, - 13931, 14103, 14365, 14731, - 14769, 15011, 15144, 15469, - 15492, 15686, 15803, 16089, - 16164, 16254, 16483, 16634, - 16717, 16728, 16860, 17041, - 16982, 17119, 17193, 17282, - 17332, 17391, 17421, 18442, - - // QP = 14 - 0, 0, 0, 0, - 0, 0, 3448, 4986, - 5252, 6165, 6825, 7218, - 7242, 7246, 7404, 9462, - 9917, 11539, 12565, 12826, - 12742, 12232, 12031, 12452, - 12461, 12382, 12233, 12563, - 12640, 12601, 12608, 12376, - 12336, 12360, 12457, 12598, - 12601, 12771, 13030, 13394, - 13431, 13673, 13805, 14127, - 14150, 14343, 14461, 14745, - 14820, 14910, 15139, 15289, - 15374, 15384, 15515, 15699, - 15639, 15774, 15848, 15939, - 15987, 16047, 16078, 17105, - - // QP = 15 NEW - 0, 0, 0, 0, - 0, 0, 2694, 4201, - 4438, 5283, 5894, 6259, - 6284, 6296, 6451, 8442, - 8883, 10461, 11463, 11729, - 11648, 11161, 10973, 11386, - 11395, 11322, 11178, 11505, - 11581, 11542, 11548, 11314, - 11274, 11293, 11386, 11519, - 11521, 11687, 11940, 12297, - 12333, 12569, 12698, 13016, - 13037, 13227, 13343, 13622, - 13696, 13784, 14012, 14158, - 14243, 14251, 14381, 14562, - 14505, 14639, 14712, 14801, - 14852, 14909, 14940, 15967, - - // QP = 16 NEW - 0, 0, 0, 0, - 0, 0, 1798, 3038, - 3259, 4010, 4575, 4973, - 4994, 5035, 5185, 7159, - 7590, 9156, 10154, 10429, - 10350, 9874, 9691, 10106, - 10117, 10042, 9903, 10231, - 10305, 10266, 10272, 10034, - 9993, 10009, 10099, 10226, - 10228, 10391, 10643, 10994, - 11032, 11267, 11395, 11711, - 11732, 11922, 12035, 12315, - 12389, 12476, 12701, 12849, - 12935, 12942, 13073, 13253, - 13195, 13329, 13403, 13490, - 13543, 13600, 13631, 14672, - - // QP = 17 NEW - 0, 0, 0, 0, - 0, 0, 1179, 2079, - 2231, 2726, 2954, 3449, - 3505, 3620, 3838, 5806, - 6225, 7771, 8751, 9036, - 8968, 8503, 8335, 8755, - 8770, 8701, 8566, 8899, - 8970, 8941, 8944, 8707, - 8666, 8679, 8764, 8885, - 8887, 9045, 9293, 9637, - 9670, 9900, 10027, 10336, - 10357, 10544, 10655, 10929, - 11002, 11089, 11309, 11456, - 11541, 11547, 11679, 11858, - 11797, 11931, 12005, 12092, - 12145, 12201, 12232, 13285, - - // QP = 18 NEW - 0, 0, 0, 0, - 0, 0, 916, 1661, - 1767, 2096, 2049, 2022, - 2028, 2223, 2513, 4678, - 5145, 6780, 7769, 8045, - 7974, 7493, 7307, 7726, - 7747, 7679, 7536, 7890, - 7964, 7952, 7967, 7769, - 7725, 7758, 7857, 7998, - 8009, 8165, 8412, 8769, - 8795, 9028, 9151, 9460, - 9477, 9664, 9771, 10042, - 10110, 10199, 10413, 10558, - 10642, 10650, 10778, 10951, - 10893, 11025, 11095, 11183, - 11234, 11290, 11319, 12364, - - // QP = 19 NEW - 0, 0, 0, 0, - 0, 0, 542, 1148, - 1245, 1526, 1487, 1384, - 1361, 1477, 1698, 3622, - 4078, 5620, 6583, 6847, - 6773, 6303, 6124, 6529, - 6546, 6467, 6333, 6655, - 6731, 6712, 6712, 6514, - 6461, 6494, 6610, 6750, - 6765, 6927, 7178, 7536, - 7557, 7807, 7933, 8242, - 8252, 8442, 8548, 8811, - 8887, 8972, 9181, 9327, - 9410, 9414, 9543, 9715, - 9661, 9792, 9859, 9950, - 9996, 10055, 10084, 11139, - - // QP = 20 NEW - 0, 0, 0, 0, - 0, 0, 452, 957, - 729, 949, 1036, 1145, - 1146, 1291, 1514, 2966, - 3294, 4394, 5166, 5627, - 5612, 5435, 5459, 6029, - 6061, 6081, 6062, 6392, - 6459, 6467, 6465, 6331, - 6293, 6334, 6437, 6570, - 6584, 6724, 6941, 7248, - 7265, 7475, 7587, 7836, - 7859, 8017, 8103, 8324, - 8377, 8457, 8620, 8752, - 8813, 8825, 8918, 9078, - 9040, 9138, 9204, 9280, - 9310, 9358, 9389, 10165, - - // QP = 21 NEW - 0, 0, 0, 0, - 0, 0, 376, 797, - 426, 590, 722, 947, - 965, 1129, 1350, 2429, - 2660, 3435, 4054, 4625, - 4649, 4687, 4867, 5566, - 5612, 5719, 5802, 6139, - 6197, 6231, 6226, 6153, - 6129, 6178, 6269, 6395, - 6408, 6527, 6712, 6970, - 6984, 7158, 7255, 7450, - 7484, 7613, 7680, 7863, - 7897, 7972, 8093, 8213, - 8254, 8273, 8334, 8483, - 8459, 8527, 8593, 8655, - 8670, 8709, 8741, 9277, - - // QP = 22 NEW - 0, 0, 0, 0, - 0, 0, 314, 664, - 249, 366, 503, 783, - 812, 987, 1204, 1989, - 2149, 2685, 3182, 3801, - 3852, 4041, 4339, 5140, - 5196, 5378, 5553, 5896, - 5947, 6003, 5997, 5980, - 5969, 6026, 6105, 6224, - 6236, 6336, 6490, 6704, - 6713, 6854, 6939, 7084, - 7128, 7229, 7280, 7429, - 7444, 7515, 7598, 7707, - 7731, 7755, 7788, 7928, - 7915, 7958, 8022, 8072, - 8075, 8105, 8138, 8466, - - // QP = 23 NEW - 0, 0, 0, 0, - 0, 0, 261, 554, - 146, 228, 350, 648, - 684, 863, 1074, 1629, - 1735, 2099, 2497, 3124, - 3192, 3485, 3868, 4746, - 4811, 5057, 5315, 5662, - 5706, 5784, 5776, 5812, - 5814, 5877, 5946, 6058, - 6069, 6151, 6276, 6447, - 6454, 6563, 6636, 6735, - 6788, 6865, 6901, 7018, - 7017, 7084, 7134, 7233, - 7240, 7270, 7278, 7408, - 7407, 7426, 7489, 7529, - 7520, 7543, 7577, 7726, - - // QP = 24 NEW - 0, 0, 0, 0, - 0, 0, 218, 461, - 85, 142, 244, 536, - 576, 755, 958, 1334, - 1402, 1641, 1960, 2567, - 2644, 3005, 3448, 4382, - 4455, 4756, 5087, 5438, - 5475, 5573, 5563, 5649, - 5662, 5732, 5790, 5896, - 5907, 5971, 6068, 6200, - 6204, 6284, 6346, 6403, - 6465, 6519, 6541, 6630, - 6614, 6678, 6697, 6787, - 6781, 6815, 6801, 6923, - 6930, 6930, 6991, 7022, - 7004, 7020, 7055, 7050, - - // QP = 25 NEW - 0, 0, 0, 0, - 0, 7, 19, 48, - 50, 88, 170, 443, - 485, 660, 854, 1092, - 1132, 1283, 1538, 2110, - 2191, 2591, 3074, 4046, - 4125, 4472, 4869, 5223, - 5254, 5369, 5358, 5490, - 5515, 5591, 5639, 5739, - 5749, 5796, 5868, 5963, - 5964, 6017, 6069, 6088, - 6157, 6191, 6200, 6263, - 6235, 6295, 6288, 6369, - 6351, 6389, 6356, 6469, - 6485, 6467, 6527, 6549, - 6523, 6533, 6568, 6434, - - // QP = 26 NEW - 0, 0, 0, 0, - 0, 2, 12, 29, - 30, 53, 105, 283, - 312, 427, 547, 665, - 688, 779, 939, 1306, - 1368, 1691, 2049, 2499, - 2514, 2684, 3153, 3834, - 3904, 4189, 4290, 4491, - 4525, 4616, 4670, 4774, - 4786, 4830, 4900, 4991, - 4994, 5042, 5092, 5118, - 5181, 5213, 5226, 5284, - 5262, 5315, 5314, 5395, - 5375, 5408, 5390, 5488, - 5504, 5491, 5546, 5570, - 5553, 5558, 5590, 5504, - - // QP = 27 NEW - 0, 0, 0, 0, - 0, 2, 9, 20, - 20, 35, 70, 190, - 209, 286, 359, 385, - 384, 393, 484, 662, - 712, 968, 1221, 1573, - 1587, 1801, 2134, 2454, - 2505, 2685, 2843, 3315, - 3389, 3633, 3793, 3968, - 3984, 4036, 4110, 4205, - 4205, 4255, 4304, 4332, - 4386, 4419, 4433, 4492, - 4477, 4522, 4530, 4603, - 4583, 4616, 4602, 4693, - 4707, 4702, 4745, 4770, - 4759, 4766, 4795, 4750, - - // QP = 28 NEW - 0, 0, 0, 0, - 0, 1, 7, 15, - 15, 24, 49, 132, - 145, 197, 245, 248, - 243, 230, 276, 379, - 412, 570, 733, 1049, - 1069, 1175, 1285, 1532, - 1586, 1759, 1918, 2225, - 2276, 2507, 2752, 3096, - 3114, 3240, 3344, 3460, - 3463, 3518, 3571, 3606, - 3650, 3684, 3704, 3760, - 3746, 3788, 3800, 3872, - 3854, 3885, 3877, 3961, - 3973, 3972, 4010, 4031, - 4032, 4037, 4067, 4060, - - // QP = 29 NEW - 0, 0, 0, 0, - 0, 2, 6, 11, - 11, 18, 36, 94, - 103, 139, 171, 169, - 165, 151, 179, 245, - 263, 363, 462, 673, - 696, 790, 868, 1058, - 1097, 1227, 1368, 1612, - 1652, 1818, 2013, 2315, - 2335, 2471, 2595, 2743, - 2753, 2818, 2881, 2923, - 2963, 2994, 3022, 3074, - 3067, 3105, 3120, 3186, - 3167, 3199, 3201, 3272, - 3283, 3287, 3321, 3340, - 3348, 3350, 3377, 3410, - - // QP = 30 NEW - 0, 0, 0, 0, - 0, 0, 5, 9, - 9, 14, 28, 71, - 77, 104, 126, 123, - 120, 108, 128, 176, - 188, 257, 322, 473, - 496, 555, 585, 737, - 775, 902, 1049, 1262, - 1293, 1425, 1590, 1842, - 1865, 1994, 2118, 2279, - 2297, 2371, 2451, 2514, - 2548, 2589, 2620, 2679, - 2677, 2714, 2729, 2789, - 2777, 2809, 2809, 2881, - 2887, 2891, 2920, 2936, - 2958, 2954, 2978, 3037, - - // QP = 31 NEW - 0, 0, 0, 0, - 0, 1, 4, 8, - 7, 11, 21, 52, - 57, 75, 91, 87, - 85, 76, 90, 122, - 129, 175, 219, 328, - 346, 395, 404, 511, - 537, 628, 759, 937, - 968, 1073, 1197, 1400, - 1418, 1520, 1622, 1771, - 1783, 1855, 1933, 2004, - 2030, 2070, 2114, 2175, - 2177, 2210, 2232, 2289, - 2277, 2305, 2313, 2378, - 2384, 2390, 2414, 2428, - 2454, 2450, 2475, 2562, - - // QP = 32 NEW - 0, 0, 0, 0, - 0, 0, 3, 6, - 6, 9, 16, 39, - 42, 55, 66, 63, - 61, 55, 65, 87, - 92, 123, 154, 234, - 247, 285, 289, 367, - 386, 456, 563, 704, - 728, 808, 906, 1061, - 1083, 1160, 1245, 1369, - 1376, 1443, 1516, 1590, - 1611, 1650, 1694, 1756, - 1763, 1793, 1815, 1870, - 1861, 1887, 1899, 1955, - 1959, 1968, 1986, 2004, - 2031, 2027, 2048, 2152, - - // QP = 33 NEW - 0, 0, 0, 0, - 0, 1, 3, 5, - 5, 7, 13, 30, - 32, 42, 50, 47, - 45, 41, 48, 65, - 68, 90, 113, 172, - 183, 211, 212, 271, - 285, 338, 426, 533, - 557, 619, 696, 818, - 835, 898, 966, 1067, - 1077, 1131, 1195, 1273, - 1286, 1329, 1381, 1443, - 1454, 1486, 1507, 1561, - 1553, 1580, 1592, 1641, - 1646, 1656, 1671, 1688, - 1713, 1712, 1733, 1841, - - // QP = 34 NEW - 0, 0, 0, 0, - 0, 0, 2, 4, - 4, 6, 10, 23, - 25, 32, 38, 35, - 34, 31, 36, 49, - 52, 68, 85, 130, - 139, 161, 161, 205, - 216, 258, 330, 414, - 435, 482, 546, 642, - 654, 705, 757, 840, - 847, 894, 949, 1017, - 1028, 1074, 1118, 1195, - 1199, 1239, 1262, 1318, - 1315, 1339, 1352, 1398, - 1402, 1410, 1425, 1440, - 1467, 1466, 1483, 1591, - - // QP = 35 NEW - 0, 0, 0, 0, - 0, 0, 2, 3, - 3, 5, 8, 19, - 20, 25, 30, 27, - 26, 23, 28, 38, - 41, 53, 66, 101, - 107, 125, 124, 160, - 169, 203, 262, 331, - 348, 387, 441, 523, - 529, 569, 616, 685, - 692, 729, 774, 838, - 841, 877, 925, 995, - 1004, 1051, 1076, 1132, - 1137, 1164, 1180, 1223, - 1228, 1237, 1249, 1266, - 1293, 1288, 1309, 1419, - - // QP = 36 NEW - 0, 0, 0, 0, - 0, 1, 1, 3, - 3, 4, 7, 15, - 16, 20, 23, 21, - 20, 18, 22, 30, - 32, 41, 51, 77, - 82, 96, 95, 124, - 130, 158, 204, 261, - 275, 307, 353, 422, - 428, 465, 503, 562, - 568, 601, 641, 700, - 700, 733, 772, 835, - 842, 887, 911, 961, - 972, 994, 1015, 1056, - 1060, 1072, 1083, 1099, - 1124, 1125, 1142, 1246, - - // QP = 37 NEW - 0, 0, 0, 0, - 0, 1, 1, 2, - 2, 3, 6, 12, - 13, 16, 19, 17, - 16, 15, 17, 24, - 26, 33, 41, 62, - 66, 77, 76, 98, - 104, 127, 165, 211, - 223, 250, 290, 349, - 356, 388, 422, 474, - 483, 511, 547, 604, - 602, 632, 668, 725, - 735, 772, 796, 840, - 853, 874, 894, 929, - 937, 951, 960, 977, - 999, 1001, 1018, 1120, - - // QP = 38 NEW - 0, 0, 0, 0, - 0, 0, 1, 2, - 2, 3, 5, 10, - 11, 13, 15, 14, - 13, 12, 14, 19, - 20, 26, 33, 48, - 51, 59, 58, 76, - 80, 98, 127, 163, - 174, 195, 229, 277, - 283, 310, 339, 383, - 392, 417, 448, 499, - 497, 524, 556, 605, - 615, 646, 669, 706, - 718, 736, 757, 787, - 795, 808, 816, 833, - 852, 853, 871, 965, - - // QP = 39 NEW - 0, 0, 0, 0, - 0, 1, 1, 2, - 2, 2, 4, 8, - 9, 11, 12, 11, - 11, 9, 11, 16, - 17, 21, 26, 39, - 41, 47, 46, 60, - 63, 77, 101, 130, - 137, 154, 183, 225, - 230, 252, 278, 317, - 326, 351, 376, 427, - 424, 447, 479, 524, - 534, 562, 583, 618, - 630, 647, 668, 698, - 703, 718, 727, 745, - 761, 763, 779, 873, - - // QP = 40 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 2, 3, 7, - 7, 9, 10, 9, - 8, 8, 9, 13, - 14, 17, 21, 30, - 32, 37, 36, 46, - 48, 59, 77, 99, - 105, 119, 141, 175, - 178, 200, 220, 251, - 261, 280, 301, 348, - 344, 365, 395, 432, - 440, 464, 488, 517, - 528, 544, 563, 592, - 597, 610, 620, 637, - 652, 655, 671, 759, - - // QP = 41 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 2, 3, 6, - 6, 7, 8, 7, - 7, 6, 7, 10, - 11, 14, 17, 25, - 26, 30, 29, 36, - 38, 46, 61, 77, - 82, 92, 111, 137, - 141, 157, 174, 201, - 209, 227, 243, 286, - 280, 299, 326, 359, - 368, 390, 408, 437, - 446, 461, 481, 511, - 515, 529, 539, 556, - 571, 577, 591, 679, - - // QP = 42 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 5, - 5, 6, 7, 6, - 6, 5, 6, 8, - 9, 11, 14, 20, - 20, 23, 22, 28, - 29, 35, 47, 58, - 63, 70, 85, 105, - 108, 122, 133, 156, - 162, 177, 188, 225, - 220, 235, 259, 286, - 296, 314, 328, 353, - 363, 375, 395, 421, - 426, 440, 448, 469, - 478, 490, 500, 588, - - // QP = 43 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 4, - 4, 5, 6, 5, - 5, 4, 5, 7, - 7, 9, 11, 16, - 17, 19, 18, 23, - 24, 28, 38, 46, - 49, 55, 67, 83, - 85, 97, 105, 123, - 128, 141, 149, 180, - 176, 188, 209, 230, - 239, 256, 268, 290, - 297, 311, 328, 349, - 356, 367, 377, 396, - 404, 418, 430, 521, - - // QP = 44 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 3, - 3, 4, 5, 4, - 4, 3, 4, 6, - 6, 8, 9, 13, - 13, 15, 14, 18, - 19, 22, 29, 36, - 38, 43, 51, 64, - 66, 75, 82, 96, - 100, 110, 115, 140, - 137, 146, 163, 180, - 189, 200, 211, 228, - 234, 247, 261, 279, - 282, 295, 301, 320, - 328, 341, 349, 437, - - // QP = 45 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 1, 3, - 3, 3, 4, 3, - 3, 3, 3, 5, - 5, 6, 7, 10, - 10, 12, 11, 14, - 14, 17, 23, 28, - 29, 33, 40, 49, - 51, 59, 63, 74, - 78, 85, 89, 110, - 106, 114, 128, 141, - 147, 157, 166, 180, - 186, 196, 208, 223, - 226, 238, 242, 260, - 266, 278, 288, 371, - - // QP = 46 NEW - 0, 0, 0, 0, - 0, 0, 0, 1, - 1, 1, 1, 2, - 2, 3, 3, 3, - 3, 2, 3, 4, - 4, 5, 6, 8, - 8, 10, 9, 11, - 12, 14, 18, 22, - 23, 26, 31, 39, - 41, 46, 50, 57, - 61, 67, 70, 86, - 84, 91, 102, 111, - 117, 125, 131, 143, - 149, 157, 167, 179, - 180, 191, 197, 212, - 215, 226, 235, 312, - - // QP = 47 NEW - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 1, 1, 2, - 2, 2, 3, 2, - 2, 2, 2, 3, - 3, 4, 5, 7, - 7, 8, 7, 9, - 9, 11, 15, 18, - 18, 20, 25, 31, - 32, 36, 39, 46, - 48, 52, 55, 68, - 66, 71, 80, 88, - 92, 97, 103, 113, - 117, 123, 133, 143, - 145, 154, 158, 170, - 174, 184, 189, 260, - - // QP = 48 NEW - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 1, 1, 2, - 2, 2, 2, 2, - 2, 2, 2, 3, - 3, 3, 4, 5, - 5, 6, 6, 7, - 8, 9, 12, 14, - 15, 16, 20, 24, - 25, 29, 31, 36, - 38, 41, 44, 54, - 52, 56, 64, 70, - 73, 77, 82, 91, - 94, 100, 106, 115, - 116, 124, 129, 138, - 141, 150, 155, 218, - - // QP = 49 NEW - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 2, 2, 2, - 1, 1, 2, 2, - 2, 3, 3, 4, - 4, 5, 5, 6, - 6, 7, 9, 11, - 12, 13, 16, 19, - 20, 23, 25, 29, - 30, 33, 35, 43, - 41, 45, 50, 55, - 59, 61, 65, 73, - 76, 80, 86, 92, - 93, 99, 104, 112, - 114, 121, 127, 181, - - // QP = 50 - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 1, - 1, 1, 1, 2, - 2, 2, 3, 4, - 4, 4, 4, 5, - 5, 6, 8, 9, - 10, 11, 13, 16, - 16, 18, 20, 23, - 24, 26, 28, 35, - 32, 35, 40, 44, - 46, 48, 52, 57, - 60, 64, 67, 73, - 74, 79, 83, 90, - 91, 97, 102, 148, - - // QP = 51 - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - 1, 1, 1, 1, - 1, 1, 1, 2, - 2, 2, 2, 3, - 3, 4, 3, 4, - 4, 5, 6, 7, - 8, 9, 11, 13, - 14, 15, 16, 19, - 20, 21, 22, 28, - 26, 29, 32, 35, - 38, 39, 42, 46, - 49, 52, 54, 60, - 61, 64, 67, 73, - 73, 77, 83, 122, -}; - - - -static const EB_Bit_Number initialRateControlIntraSad64x64Tables[] = { - // QP = 0 NEW - 0, 0, 0, 0, - 0, 0, 0, 22636, - 22804, 23718, 23852, 24210, - 23882, 24027, 24723, 25937, - 24896, 27051, 30603, 31453, - 30784, 29404, 30546, 31836, - 32090, 31576, 31532, 32354, - 31761, 32869, 32349, 31100, - 32368, 32773, 31148, 31299, - 32400, 31203, 32530, 33114, - 31942, 32664, 33074, 32774, - 32967, 33796, 34026, 33873, - 34018, 33566, 33505, 33776, - 34656, 33412, 33047, 34654, - 34543, 33790, 34751, 34184, - 34744, 34563, 34510, 35474, - // QP = 1 NEW - 0, 0, 0, 0, - 0, 0, 0, 21659, - 21816, 22686, 22860, 23146, - 22961, 22904, 23810, 24897, - 23850, 26033, 29440, 30276, - 29599, 28297, 29378, 30650, - 30930, 30445, 30407, 31191, - 30586, 31676, 31198, 30016, - 31223, 31615, 30048, 30194, - 31185, 30078, 31338, 31915, - 30882, 31510, 31926, 31660, - 31791, 32623, 32868, 32707, - 32824, 32408, 32327, 32611, - 33459, 32300, 31943, 33432, - 33331, 32635, 33511, 33026, - 33511, 33404, 33292, 34267, - // QP = 2 - 0, 0, 0, 0, - 0, 0, 0, 20399, - 20567, 21406, 21530, 21929, - 21604, 21684, 22474, 23556, - 22611, 24706, 28076, 28899, - 28275, 26929, 28047, 29297, - 29548, 29095, 29020, 29833, - 29249, 30324, 29833, 28626, - 29780, 30181, 28604, 28818, - 29824, 28750, 29998, 30512, - 29412, 30121, 30537, 30248, - 30429, 31252, 31414, 31288, - 31421, 30982, 30933, 31208, - 32051, 30854, 30518, 31943, - 31952, 31237, 32142, 31609, - 32102, 31959, 31906, 32837, - // QP = 3 - 0, 0, 0, 0, - 0, 0, 0, 19278, - 19449, 20318, 20495, 20815, - 20537, 20503, 21392, 22463, - 21541, 23616, 26914, 27740, - 27129, 25796, 26901, 28122, - 28442, 27938, 27874, 28713, - 28091, 29162, 28709, 27509, - 28679, 29114, 27560, 27700, - 28685, 27664, 28835, 29447, - 28371, 28998, 29423, 29193, - 29293, 30094, 30347, 30154, - 30299, 29876, 29795, 30090, - 30902, 29774, 29426, 30865, - 30778, 30106, 30959, 30464, - 30976, 30850, 30753, 31702, - // QP = 4 - 0, 0, 0, 0, - 0, 0, 0, 18171, - 18354, 19219, 19332, 19723, - 19474, 19490, 20348, 21392, - 20368, 22505, 25809, 26611, - 25991, 24661, 25761, 26942, - 27288, 26798, 26731, 27550, - 26911, 28042, 27558, 26384, - 27526, 27936, 26419, 26553, - 27574, 26480, 27685, 28267, - 27204, 27832, 28294, 28032, - 28155, 28976, 29137, 28959, - 29115, 28814, 28717, 28962, - 29719, 28627, 28291, 29654, - 29652, 28941, 29761, 29304, - 29797, 29674, 29572, 30538, - // QP = 5 - 0, 0, 0, 0, - 0, 0, 0, 17304, - 17457, 18373, 18467, 18776, - 18583, 18576, 19376, 20392, - 19573, 21570, 24793, 25581, - 24983, 23657, 24776, 25934, - 26202, 25721, 25718, 26507, - 25892, 26948, 26449, 25395, - 26469, 26895, 25391, 25548, - 26495, 25496, 26647, 27165, - 26147, 26758, 27200, 26942, - 27075, 27839, 28026, 27878, - 28012, 27638, 27560, 27891, - 28602, 27515, 27171, 28499, - 28483, 27837, 28660, 28174, - 28676, 28553, 28469, 29365, - // QP = 6 - 0, 0, 0, 0, - 0, 0, 0, 15929, - 16089, 16985, 17125, 17491, - 17251, 17283, 18054, 19104, - 18314, 20221, 23516, 24335, - 23720, 22396, 23479, 24639, - 24980, 24523, 24413, 25215, - 24647, 25710, 25220, 24072, - 25195, 25631, 24133, 24282, - 25225, 24149, 25378, 25927, - 24881, 25491, 25929, 25656, - 25833, 26621, 26803, 26604, - 26773, 26352, 26292, 26584, - 27341, 26252, 25940, 27300, - 27286, 26603, 27454, 26947, - 27432, 27279, 27167, 28112, - // QP = 7 - 0, 0, 0, 0, - 0, 0, 0, 14880, - 15069, 15956, 16137, 16474, - 16195, 16274, 17013, 18093, - 17175, 19187, 22485, 23231, - 22634, 21368, 22434, 23566, - 23858, 23427, 23355, 24114, - 23568, 24595, 24112, 23011, - 24110, 24575, 23075, 23184, - 24166, 23173, 24319, 24888, - 23815, 24442, 24833, 24637, - 24776, 25525, 25705, 25503, - 25659, 25296, 25215, 25490, - 26246, 25199, 24904, 26188, - 26180, 25489, 26316, 25833, - 26304, 26186, 26103, 27009, - // QP = 8 - 0, 0, 0, 0, - 0, 0, 0, 13746, - 13894, 14720, 14893, 15257, - 14973, 15025, 15803, 16851, - 15988, 17920, 21188, 21995, - 21377, 20093, 21107, 22309, - 22570, 22144, 22077, 22829, - 22295, 23282, 22820, 21751, - 22828, 23247, 21787, 21932, - 22876, 21875, 23024, 23546, - 22486, 23156, 23575, 23275, - 23442, 24200, 24380, 24242, - 24385, 23965, 23914, 24167, - 24947, 23860, 23570, 24889, - 24872, 24182, 25009, 24486, - 25011, 24872, 24812, 25682, - // QP = 9 NEW - 0, 0, 0, 0, - 0, 0, 0, 12644, - 12844, 13728, 13872, 14304, - 14018, 13956, 14863, 15842, - 14974, 16981, 20166, 20918, - 20330, 19073, 20106, 21294, - 21529, 21121, 21044, 21784, - 21235, 22283, 21797, 20747, - 21782, 22261, 20823, 20944, - 21863, 20876, 22020, 22541, - 21425, 22116, 22537, 22261, - 22440, 23180, 23345, 23186, - 23330, 22950, 22880, 23167, - 23891, 22853, 22545, 23817, - 23831, 23158, 23965, 23527, - 23957, 23852, 23782, 24640, - // QP = 10 NEW - - 0, 0, 0, 0, - 0, 0, 0, 11514, - 11684, 12528, 12643, 13059, - 12783, 12779, 13652, 14690, - 13845, 15753, 18925, 19726, - 19150, 17862, 18913, 20057, - 20354, 19916, 19866, 20598, - 20056, 21068, 20616, 19489, - 20567, 21018, 19535, 19650, - 20618, 19626, 20761, 21328, - 20235, 20913, 21289, 21021, - 21183, 21922, 22118, 21999, - 22111, 21710, 21680, 21946, - 22663, 21580, 21278, 22568, - 22616, 21924, 22754, 22227, - 22784, 22604, 22541, 23392, - // QP = 11 NEW - 0, 0, 0, 0, - 0, 0, 0, 10630, - 10786, 11619, 11781, 12167, - 11834, 11885, 12764, 13787, - 12899, 14895, 18047, 18837, - 18207, 16962, 17993, 19141, - 19397, 18970, 18891, 19631, - 19055, 20083, 19662, 18612, - 19654, 20150, 18668, 18764, - 19780, 18745, 19902, 20417, - 19290, 20002, 20427, 20163, - 20268, 21030, 21198, 21045, - 21230, 20798, 20725, 21031, - 21732, 20708, 20418, 21640, - 21691, 20988, 21828, 21315, - 21796, 21639, 21631, 22465, - - // QP = 12 NEW - 0, 0, 0, 0, - 0, 0, 0, 9344, - 9545, 10341, 10496, 10916, - 10660, 10698, 11527, 12506, - 11605, 13628, 16847, 17618, - 17024, 15743, 16781, 17898, - 18200, 17803, 17668, 18421, - 17851, 18901, 18406, 17358, - 18429, 18925, 17404, 17517, - 18516, 17530, 18701, 19254, - 18116, 18813, 19232, 18926, - 19081, 19815, 19993, 19899, - 20042, 19552, 19555, 19803, - 20554, 19543, 19182, 20473, - 20487, 19760, 20636, 20171, - 20629, 20462, 20377, 21271, - - // QP = 13 NEW - 0, 0, 0, 0, - 0, 0, 0, 8432, - 8573, 9428, 9562, 9983, - 9642, 9722, 10557, 11542, - 10651, 12611, 15744, 16537, - 15938, 14720, 15759, 16886, - 17132, 16736, 16634, 17395, - 16836, 17854, 17393, 16305, - 17394, 17815, 16345, 16498, - 17465, 16440, 17592, 18156, - 17035, 17698, 18106, 17828, - 17962, 18724, 18871, 18749, - 18871, 18503, 18497, 18697, - 19406, 18392, 18068, 19397, - 19393, 18734, 19512, 19065, - 19520, 19379, 19308, 20139, - - // QP = 14 NEW - 0, 0, 0, 0, - 0, 0, 0, 7285, - 7445, 8289, 8492, 8746, - 8455, 8574, 9369, 10346, - 9473, 11443, 14522, 15289, - 14716, 13523, 14566, 15683, - 15915, 15513, 15453, 16193, - 15665, 16634, 16164, 15107, - 16197, 16592, 15159, 15353, - 16256, 15203, 16417, 16928, - 15827, 16477, 16857, 16635, - 16703, 17512, 17632, 17548, - 17681, 17234, 17208, 17467, - 18197, 17164, 16858, 18147, - 18142, 17480, 18283, 17773, - 18286, 18110, 18084, 18902, - - // QP = 15 NEW - 0, 0, 0, 0, - 0, 0, 0, 6214, - 6406, 7229, 7436, 7675, - 7449, 7582, 8347, 9325, - 8482, 10387, 13458, 14232, - 13671, 12453, 13483, 14620, - 14823, 14430, 14398, 15153, - 14606, 15605, 15137, 14080, - 15145, 15569, 14115, 14300, - 15182, 14186, 15350, 15858, - 14756, 15452, 15763, 15516, - 15667, 16472, 16569, 16462, - 16563, 16178, 16134, 16424, - 17139, 16112, 15795, 17090, - 17063, 16422, 17253, 16707, - 17208, 17077, 17011, 17839, - - // QP = 16 NEW - 0, 0, 0, 0, - 0, 0, 0, 5089, - 5295, 6085, 6250, 6500, - 6352, 6344, 7187, 8204, - 7275, 9209, 12282, 13060, - 12449, 11293, 12320, 13458, - 13687, 13243, 13218, 13965, - 13458, 14422, 13950, 12890, - 13937, 14400, 12961, 13098, - 14038, 13030, 14174, 14678, - 13614, 14266, 14592, 14359, - 14528, 15266, 15432, 15313, - 15391, 15032, 14973, 15198, - 15971, 14933, 14689, 15883, - 15940, 15238, 16039, 15559, - 16021, 15913, 15859, 16669, - - // QP = 17 NEW - 0, 0, 0, 0, - 0, 0, 0, 4258, - 4410, 5177, 5338, 5619, - 5381, 5501, 6175, 7168, - 6335, 8238, 11256, 12062, - 11451, 10296, 11287, 12446, - 12658, 12254, 12223, 12948, - 12435, 13416, 12951, 11897, - 12955, 13370, 11964, 12147, - 13009, 12010, 13184, 13684, - 12626, 13289, 13645, 13353, - 13519, 14268, 14393, 14302, - 14362, 14079, 13991, 14218, - 14980, 13929, 13593, 14932, - 14914, 14211, 15021, 14514, - 15051, 14897, 14839, 15651, - - // QP = 18 NEW - 0, 0, 0, 0, - 0, 0, 0, 3353, - 3493, 4214, 4330, 4599, - 4420, 4486, 5191, 6224, - 5417, 7217, 10145, 10892, - 10338, 9231, 10181, 11268, - 11489, 11157, 11127, 11804, - 11248, 12314, 11820, 10808, - 11808, 12212, 10874, 11011, - 11873, 10888, 12050, 12523, - 11467, 12150, 12457, 12199, - 12363, 13104, 13245, 13158, - 13203, 12877, 12795, 13042, - 13775, 12697, 12444, 13776, - 13699, 13087, 13831, 13356, - 13842, 13685, 13659, 14495, - - // QP = 19 NEW - 0, 0, 0, 0, - 0, 0, 0, 2656, - 2789, 3394, 3522, 3849, - 3653, 3726, 4374, 5366, - 4579, 6257, 9138, 9873, - 9361, 8274, 9211, 10283, - 10512, 10161, 10125, 10819, - 10289, 11250, 10834, 9824, - 10812, 11198, 9848, 10057, - 10892, 9901, 11027, 11498, - 10424, 11180, 11421, 11178, - 11365, 12108, 12208, 12108, - 12181, 11846, 11802, 12052, - 12715, 11708, 11417, 12699, - 12698, 12094, 12816, 12368, - 12822, 12686, 12596, 13468, - - // QP = 20 NEW - 0, 0, 0, 0, - 0, 0, 0, 1940, - 2058, 2584, 2713, 3020, - 2842, 2981, 3498, 4392, - 3672, 5306, 8051, 8729, - 8210, 7210, 8107, 9179, - 9353, 8998, 9009, 9650, - 9133, 10105, 9694, 8749, - 9676, 10028, 8700, 8920, - 9732, 8790, 9903, 10317, - 9341, 10004, 10282, 10031, - 10174, 10903, 11012, 10965, - 10979, 10659, 10612, 10886, - 11532, 10521, 10271, 11524, - 11478, 10898, 11633, 11217, - 11601, 11546, 11426, 12284, - - // QP = 21 NEW - 0, 0, 0, 0, - 0, 0, 0, 1406, - 1508, 1943, 2045, 2362, - 2225, 2298, 2817, 3561, - 3002, 4491, 7094, 7752, - 7280, 6353, 7152, 8168, - 8358, 8050, 8010, 8731, - 8205, 9085, 8725, 7739, - 8685, 9004, 7794, 7939, - 8685, 7772, 8871, 9286, - 8443, 8992, 9232, 8986, - 9154, 9850, 10029, 9921, - 9928, 9675, 9598, 9874, - 10484, 9483, 9189, 10483, - 10406, 9902, 10581, 10189, - 10561, 10487, 10412, 11239, - - // QP = 22 NEW - 0, 0, 0, 0, - 0, 0, 0, 935, - 1011, 1343, 1472, 1733, - 1660, 1720, 2176, 2820, - 2348, 3666, 6111, 6765, - 6356, 5438, 6227, 7191, - 7333, 7061, 7035, 7716, - 7196, 8040, 7699, 6744, - 7653, 7934, 6760, 6927, - 7612, 6791, 7780, 8204, - 7379, 7950, 8184, 7917, - 8047, 8729, 8926, 8795, - 8828, 8569, 8493, 8741, - 9399, 8372, 8132, 9400, - 9335, 8789, 9462, 9097, - 9512, 9361, 9293, 10111, - - // QP = 23 NEW - 0, 0, 0, 0, - 0, 0, 0, 661, - 727, 969, 1068, 1324, - 1298, 1316, 1715, 2268, - 1927, 3027, 5217, 5826, - 5467, 4689, 5374, 6329, - 6449, 6197, 6175, 6850, - 6358, 7124, 6848, 5923, - 6775, 7011, 5927, 6044, - 6714, 5934, 6824, 7264, - 6566, 7040, 7216, 7010, - 7126, 7759, 8012, 7799, - 7878, 7670, 7532, 7778, - 8405, 7457, 7194, 8406, - 8305, 7845, 8424, 8076, - 8507, 8377, 8315, 9114, - - // QP = 24 NEW - 0, 0, 0, 0, - 0, 0, 0, 433, - 473, 640, 714, 997, - 974, 998, 1361, 1769, - 1582, 2469, 4379, 4973, - 4661, 4025, 4625, 5495, - 5638, 5381, 5373, 6007, - 5563, 6248, 6010, 5139, - 5912, 6132, 5076, 5265, - 5826, 5145, 5960, 6369, - 5749, 6104, 6263, 6131, - 6204, 6805, 7046, 6860, - 6895, 6746, 6630, 6825, - 7417, 6535, 6309, 7431, - 7362, 6959, 7490, 7128, - 7533, 7408, 7376, 8135, - - // QP = 25 NEW - 0, 0, 0, 0, - 0, 0, 0, 281, - 305, 428, 485, 759, - 712, 822, 1059, 1402, - 1277, 1989, 3535, 4091, - 3856, 3359, 3895, 4741, - 4823, 4637, 4664, 5243, - 4832, 5420, 5230, 4440, - 5157, 5255, 4338, 4474, - 5008, 4400, 5091, 5500, - 4920, 5251, 5424, 5279, - 5343, 5856, 6172, 5972, - 5938, 5857, 5724, 5987, - 6459, 5649, 5452, 6503, - 6372, 6088, 6481, 6208, - 6612, 6534, 6456, 7192, - - // QP = 26 NEW - 0, 0, 0, 0, - 0, 0, 0, 168, - 182, 253, 312, 561, - 527, 587, 820, 1060, - 1007, 1533, 2640, 3168, - 2976, 2677, 3140, 3886, - 3925, 3845, 3906, 4416, - 4100, 4581, 4474, 3714, - 4320, 4428, 3600, 3747, - 4104, 3643, 4239, 4590, - 4103, 4338, 4537, 4414, - 4477, 4908, 5168, 4950, - 4978, 4908, 4813, 5028, - 5468, 4758, 4631, 5521, - 5401, 5183, 5452, 5219, - 5575, 5535, 5480, 6192, - - // QP = 27 NEW - 0, 0, 0, 0, - 0, 0, 0, 121, - 126, 162, 208, 427, - 399, 484, 653, 857, - 833, 1176, 1954, 2409, - 2279, 2121, 2491, 3184, - 3186, 3190, 3264, 3753, - 3454, 3896, 3796, 3155, - 3670, 3713, 3026, 3121, - 3433, 3044, 3567, 3811, - 3430, 3652, 3769, 3682, - 3733, 4154, 4365, 4131, - 4206, 4147, 4064, 4280, - 4619, 3989, 3880, 4674, - 4623, 4438, 4639, 4398, - 4764, 4760, 4683, 5368, - - // QP = 28 NEW - 0, 0, 0, 0, - 0, 0, 0, 88, - 87, 110, 147, 316, - 323, 365, 518, 645, - 697, 890, 1300, 1660, - 1589, 1580, 1857, 2407, - 2430, 2486, 2580, 3032, - 2800, 3167, 3123, 2566, - 2982, 3011, 2438, 2555, - 2710, 2473, 2877, 3069, - 2758, 2947, 3036, 3008, - 3012, 3348, 3507, 3381, - 3433, 3353, 3291, 3511, - 3734, 3254, 3196, 3810, - 3805, 3686, 3766, 3622, - 3874, 3949, 3861, 4527, - - // QP = 29 NEW - 0, 0, 0, 0, - 0, 0, 0, 70, - 70, 82, 105, 257, - 262, 314, 427, 515, - 577, 686, 849, 1113, - 1086, 1166, 1360, 1798, - 1803, 1922, 2021, 2412, - 2214, 2553, 2572, 2127, - 2416, 2399, 1972, 2044, - 2154, 2022, 2334, 2447, - 2152, 2391, 2448, 2424, - 2450, 2706, 2882, 2713, - 2737, 2732, 2682, 2810, - 3021, 2630, 2690, 3092, - 3118, 3042, 3067, 2908, - 3158, 3250, 3187, 3812, - - // QP = 30 NEW - 0, 0, 0, 0, - 0, 0, 0, 58, - 62, 65, 88, 217, - 223, 283, 355, 420, - 482, 553, 557, 776, - 767, 895, 1043, 1381, - 1376, 1483, 1600, 1979, - 1767, 2107, 2175, 1787, - 2037, 1943, 1627, 1710, - 1752, 1711, 1926, 2039, - 1819, 1987, 2059, 2071, - 2027, 2256, 2376, 2231, - 2257, 2290, 2300, 2343, - 2522, 2199, 2278, 2595, - 2641, 2613, 2566, 2501, - 2601, 2743, 2741, 3315, - - // QP = 31 NEW - 0, 0, 0, 0, - 0, 0, 0, 52, - 52, 57, 75, 176, - 189, 239, 295, 353, - 412, 438, 336, 475, - 488, 636, 742, 957, - 954, 1084, 1195, 1457, - 1355, 1587, 1640, 1445, - 1565, 1522, 1295, 1377, - 1349, 1412, 1541, 1597, - 1403, 1586, 1618, 1644, - 1636, 1759, 1887, 1745, - 1758, 1840, 1821, 1836, - 1945, 1757, 1857, 2028, - 2138, 2102, 2059, 2018, - 2065, 2198, 2204, 2733, - - // QP = 32 NEW - 0, 0, 0, 0, - 0, 0, 0, 46, - 44, 50, 69, 154, - 155, 198, 242, 290, - 335, 334, 189, 266, - 295, 428, 486, 608, - 612, 720, 823, 1013, - 936, 1104, 1173, 1119, - 1159, 1084, 1024, 1064, - 1014, 1101, 1176, 1197, - 1096, 1249, 1233, 1279, - 1268, 1360, 1426, 1326, - 1318, 1453, 1438, 1407, - 1490, 1344, 1505, 1539, - 1686, 1665, 1569, 1580, - 1625, 1698, 1766, 2206, - - // QP = 33 NEW - 0, 0, 0, 0, - 0, 0, 0, 43, - 40, 45, 60, 135, - 148, 175, 194, 228, - 290, 273, 121, 159, - 192, 308, 339, 408, - 399, 489, 575, 694, - 651, 753, 846, 873, - 866, 799, 810, 870, - 796, 898, 934, 950, - 872, 983, 1000, 1009, - 1001, 1048, 1082, 1023, - 1032, 1144, 1171, 1111, - 1145, 1066, 1242, 1204, - 1335, 1360, 1294, 1299, - 1281, 1328, 1440, 1815, - - // QP = 34 NEW - 0, 0, 0, 0, - 0, 0, 0, 37, - 35, 39, 55, 111, - 136, 140, 169, 190, - 249, 225, 86, 102, - 138, 239, 250, 262, - 270, 327, 405, 457, - 458, 512, 590, 678, - 636, 577, 651, 694, - 623, 738, 744, 741, - 699, 818, 803, 821, - 815, 833, 846, 825, - 812, 953, 932, 881, - 885, 856, 1040, 954, - 1069, 1077, 1039, 1062, - 1041, 1069, 1200, 1503, - - // QP = 35 NEW - 0, 0, 0, 0, - 0, 0, 0, 33, - 32, 35, 47, 109, - 114, 127, 147, 158, - 201, 195, 75, 87, - 112, 197, 209, 202, - 210, 253, 314, 346, - 355, 400, 456, 567, - 511, 466, 559, 612, - 524, 659, 638, 640, - 603, 711, 668, 734, - 695, 691, 701, 696, - 693, 817, 820, 736, - 750, 763, 919, 820, - 925, 920, 911, 940, - 892, 914, 1057, 1317, - - // QP = 36 NEW - 0, 0, 0, 0, - 0, 0, 0, 30, - 29, 32, 45, 85, - 95, 100, 121, 143, - 167, 164, 61, 71, - 92, 155, 166, 158, - 156, 195, 232, 246, - 271, 296, 335, 471, - 386, 363, 468, 508, - 441, 558, 542, 526, - 503, 613, 567, 614, - 586, 590, 582, 591, - 581, 697, 694, 619, - 611, 657, 784, 697, - 796, 771, 773, 785, - 767, 781, 883, 1131, - - // QP = 37 NEW - 0, 0, 0, 0, - 0, 0, 0, 28, - 28, 29, 39, 81, - 82, 102, 106, 119, - 140, 137, 55, 62, - 80, 142, 142, 136, - 134, 170, 202, 213, - 224, 247, 274, 402, - 322, 319, 406, 448, - 399, 499, 477, 466, - 459, 539, 490, 553, - 526, 510, 512, 532, - 520, 623, 624, 564, - 553, 587, 704, 609, - 723, 691, 682, 704, - 675, 680, 814, 1022, - - // QP = 38 NEW - 0, 0, 0, 0, - 0, 0, 0, 25, - 25, 26, 35, 70, - 67, 88, 90, 100, - 114, 117, 45, 52, - 67, 114, 112, 104, - 108, 133, 157, 167, - 174, 192, 214, 323, - 265, 250, 333, 373, - 340, 416, 388, 402, - 401, 453, 427, 465, - 456, 441, 441, 458, - 438, 522, 534, 490, - 484, 513, 603, 519, - 613, 587, 590, 608, - 602, 580, 696, 888, - - // QP = 39 NEW - 0, 0, 0, 0, - 0, 0, 0, 23, - 23, 24, 30, 60, - 60, 81, 82, 83, - 102, 104, 40, 47, - 60, 97, 101, 96, - 95, 122, 136, 145, - 160, 169, 185, 285, - 228, 214, 301, 323, - 301, 375, 362, 355, - 359, 406, 388, 416, - 422, 400, 397, 413, - 392, 471, 487, 451, - 432, 455, 543, 480, - 562, 536, 527, 560, - 550, 534, 639, 812, - - // QP = 40 NEW - 0, 0, 0, 0, - 0, 0, 0, 22, - 21, 22, 30, 59, - 56, 66, 69, 68, - 79, 83, 35, 41, - 50, 80, 87, 81, - 78, 100, 107, 116, - 130, 133, 152, 238, - 187, 185, 252, 279, - 256, 314, 302, 308, - 297, 341, 321, 365, - 366, 347, 345, 346, - 339, 403, 417, 392, - 379, 413, 477, 419, - 490, 455, 463, 474, - 480, 463, 562, 714, - - // QP = 41 NEW - 0, 0, 0, 0, - 0, 0, 0, 21, - 20, 23, 28, 56, - 51, 54, 56, 65, - 65, 66, 33, 36, - 45, 68, 75, 73, - 68, 88, 101, 100, - 107, 119, 134, 204, - 161, 161, 225, 248, - 234, 274, 273, 275, - 275, 306, 288, 338, - 322, 309, 318, 315, - 307, 353, 379, 348, - 352, 375, 425, 388, - 438, 420, 418, 427, - 450, 420, 497, 653, - - // QP = 42 NEW - 0, 0, 0, 0, - 0, 0, 0, 19, - 18, 19, 27, 41, - 44, 49, 47, 54, - 52, 59, 30, 31, - 37, 59, 64, 62, - 55, 76, 82, 84, - 89, 96, 114, 167, - 141, 144, 189, 216, - 197, 235, 228, 233, - 235, 272, 252, 287, - 283, 270, 277, 277, - 265, 319, 334, 300, - 305, 325, 376, 340, - 376, 366, 363, 375, - 396, 370, 447, 574, - - // QP = 43 NEW - 0, 0, 0, 0, - 0, 0, 0, 19, - 18, 19, 23, 40, - 39, 41, 46, 49, - 41, 48, 26, 28, - 32, 50, 51, 53, - 50, 61, 74, 75, - 80, 84, 97, 151, - 128, 124, 168, 186, - 182, 208, 205, 204, - 207, 235, 223, 251, - 260, 244, 241, 243, - 242, 284, 289, 284, - 280, 296, 332, 308, - 333, 324, 316, 341, - 361, 335, 404, 524, - - // QP = 44 NEW - 0, 0, 0, 0, - 0, 0, 0, 17, - 16, 18, 20, 35, - 34, 40, 41, 37, - 43, 45, 23, 25, - 30, 41, 43, 42, - 40, 55, 60, 62, - 66, 74, 80, 120, - 100, 105, 140, 150, - 149, 172, 171, 177, - 171, 196, 192, 209, - 220, 211, 202, 204, - 206, 253, 251, 240, - 239, 255, 286, 275, - 273, 281, 284, 283, - 307, 281, 334, 453, - - // QP = 45 NEW - 0, 0, 0, 0, - 0, 0, 0, 15, - 15, 16, 21, 33, - 33, 34, 32, 32, - 40, 37, 19, 22, - 25, 36, 37, 36, - 35, 47, 51, 49, - 56, 59, 68, 102, - 86, 93, 114, 136, - 123, 156, 138, 142, - 147, 160, 157, 179, - 194, 182, 184, 190, - 176, 218, 213, 212, - 200, 224, 249, 239, - 246, 244, 240, 254, - 280, 247, 302, 395, - - // QP = 46 NEW - 0, 0, 0, 0, - 0, 0, 0, 14, - 15, 15, 17, 31, - 32, 34, 32, 31, - 33, 30, 18, 20, - 22, 31, 33, 32, - 30, 39, 42, 43, - 44, 49, 60, 87, - 71, 77, 104, 110, - 110, 126, 119, 131, - 128, 137, 138, 155, - 164, 149, 153, 154, - 150, 190, 179, 182, - 182, 193, 210, 207, - 220, 217, 220, 212, - 234, 218, 259, 343, - - // QP = 47 NEW - 0, 0, 0, 0, - 0, 0, 0, 13, - 15, 15, 19, 30, - 30, 28, 29, 28, - 28, 27, 16, 18, - 19, 25, 29, 27, - 26, 33, 35, 38, - 38, 39, 51, 73, - 58, 62, 82, 97, - 97, 104, 97, 107, - 106, 110, 121, 130, - 145, 134, 129, 136, - 124, 152, 153, 161, - 160, 163, 180, 182, - 185, 184, 183, 188, - 202, 183, 221, 297, - - // QP = 48 NEW - 0, 0, 0, 0, - 0, 0, 0, 12, - 12, 13, 17, 27, - 26, 29, 25, 26, - 26, 24, 15, 17, - 17, 24, 26, 25, - 28, 28, 30, 32, - 31, 35, 42, 58, - 50, 54, 65, 80, - 80, 87, 85, 93, - 87, 96, 100, 111, - 119, 118, 114, 117, - 115, 144, 127, 141, - 135, 145, 149, 158, - 158, 160, 151, 160, - 183, 160, 190, 259, - - // QP = 49 NEW - 0, 0, 0, 0, - 0, 0, 0, 11, - 12, 12, 16, 23, - 22, 23, 22, 23, - 23, 24, 13, 15, - 16, 21, 21, 22, - 22, 25, 28, 31, - 27, 29, 35, 46, - 45, 46, 58, 70, - 65, 74, 67, 80, - 78, 79, 80, 95, - 102, 100, 93, 97, - 95, 120, 106, 119, - 121, 128, 128, 142, - 132, 139, 137, 135, - 158, 139, 162, 223, - - // QP = 50 NEW - 0, 0, 0, 0, - 0, 0, 0, 11, - 11, 12, 15, 22, - 19, 22, 19, 20, - 21, 21, 14, 14, - 16, 18, 19, 19, - 20, 21, 23, 24, - 24, 26, 32, 40, - 36, 40, 49, 56, - 56, 59, 56, 69, - 68, 63, 73, 80, - 84, 86, 84, 81, - 79, 103, 88, 100, - 101, 105, 109, 124, - 109, 109, 113, 111, - 135, 120, 142, 191, - - // QP = 51 NEW - 0, 0, 0, 0, - 0, 0, 0, 10, - 11, 12, 14, 20, - 18, 22, 18, 21, - 21, 20, 11, 13, - 14, 17, 16, 16, - 19, 20, 24, 21, - 22, 24, 28, 33, - 34, 38, 42, 51, - 42, 49, 47, 59, - 62, 58, 62, 67, - 68, 66, 73, 73, - 65, 85, 78, 90, - 92, 101, 91, 107, - 96, 103, 96, 98, - 122, 104, 119, 166, -}; +static const EB_Bit_Number initialRateControlSad64x64Tables[] = { + // QP = 0 NEW + 0, 0, 0, 0, + 0, 0, 19064, 21410, + 21781, 22938, 23734, 24222, + 24242, 24233, 24377, 26487, + 26950, 28615, 29670, 29941, + 29857, 29336, 29130, 29572, + 29583, 29507, 29359, 29711, + 29789, 29753, 29766, 29528, + 29487, 29511, 29611, 29756, + 29758, 29933, 30202, 30579, + 30618, 30870, 31006, 31339, + 31364, 31566, 31687, 31982, + 32063, 32155, 32396, 32551, + 32640, 32651, 32787, 32978, + 32923, 33063, 33139, 33235, + 33288, 33350, 33382, 34440, + // QP = 1 NEW + 0, 0, 0, 0, + 0, 0, 18221, 20496, + 20860, 21997, 22789, 23260, + 23283, 23277, 23417, 25456, + 25906, 27517, 28544, 28819, + 28739, 28240, 28046, 28479, + 28492, 28419, 28277, 28619, + 28697, 28662, 28675, 28443, + 28404, 28427, 28526, 28669, + 28671, 28841, 29104, 29474, + 29512, 29758, 29891, 30218, + 30243, 30439, 30558, 30847, + 30927, 31019, 31253, 31404, + 31492, 31504, 31635, 31824, + 31767, 31908, 31983, 32076, + 32126, 32187, 32217, 33261, + // QP = 2 NEW + 0, 0, 0, 0, + 0, 0, 17109, 19287, + 19632, 20731, 21499, 21947, + 21966, 21954, 22094, 24133, + 24583, 26189, 27209, 27477, + 27395, 26896, 26700, 27132, + 27142, 27071, 26926, 27266, + 27342, 27305, 27318, 27087, + 27048, 27072, 27169, 27312, + 27313, 27485, 27746, 28114, + 28151, 28395, 28528, 28851, + 28878, 29072, 29189, 29478, + 29557, 29647, 29879, 30031, + 30118, 30128, 30259, 30446, + 30389, 30528, 30601, 30694, + 30746, 30806, 30837, 31865, + // QP = 3 NEW + 0, 0, 0, 0, + 0, 0, 16145, 18267, + 18604, 19688, 20447, 20882, + 20904, 20894, 21032, 23054, + 23498, 25089, 26096, 26357, + 26277, 25781, 25590, 26017, + 26029, 25959, 25818, 26156, + 26232, 26196, 26208, 25979, + 25939, 25963, 26059, 26201, + 26202, 26371, 26629, 26993, + 27030, 27271, 27404, 27723, + 27751, 27942, 28058, 28343, + 28421, 28510, 28740, 28892, + 28977, 28987, 29117, 29301, + 29246, 29381, 29456, 29546, + 29596, 29656, 29687, 30703, + // QP = 4 NEW + 0, 0, 0, 0, + 0, 0, 14466, 16764, + 17121, 18263, 19044, 19493, + 19515, 19505, 19640, 21686, + 22138, 23742, 24755, 25011, + 24929, 24429, 24236, 24666, + 24677, 24609, 24468, 24812, + 24888, 24855, 24869, 24642, + 24603, 24628, 24726, 24869, + 24871, 25041, 25302, 25665, + 25703, 25944, 26077, 26400, + 26424, 26617, 26734, 27020, + 27096, 27186, 27416, 27566, + 27651, 27663, 27794, 27979, + 27922, 28058, 28132, 28222, + 28273, 28332, 28363, 29381, + // QP = 5 NEW + 0, 0, 0, 0, + 0, 0, 13448, 15643, + 16002, 17119, 17892, 18326, + 18349, 18336, 18472, 20515, + 20962, 22564, 23574, 23823, + 23740, 23238, 23043, 23466, + 23475, 23407, 23267, 23607, + 23683, 23650, 23666, 23441, + 23404, 23430, 23527, 23671, + 23673, 23842, 24099, 24461, + 24497, 24738, 24869, 25189, + 25214, 25405, 25520, 25804, + 25880, 25970, 26197, 26346, + 26430, 26441, 26571, 26752, + 26698, 26831, 26906, 26996, + 27046, 27104, 27136, 28145, + // QP = 6 + 0, 0, 0, 0, + 0, 0, 11823, 14174, + 14548, 15711, 16489, 16927, + 16944, 16927, 17066, 19162, + 19624, 21263, 22292, 22541, + 22456, 21939, 21736, 22163, + 22174, 22098, 21956, 22298, + 22374, 22342, 22357, 22134, + 22094, 22122, 22222, 22367, + 22370, 22543, 22805, 23170, + 23208, 23451, 23584, 23907, + 23931, 24126, 24243, 24529, + 24606, 24694, 24925, 25075, + 25161, 25172, 25302, 25486, + 25428, 25564, 25640, 25729, + 25779, 25838, 25869, 26882, + // QP = 7 NEW + 0, 0, 0, 0, + 0, 0, 11047, 13263, + 13626, 14758, 15535, 15968, + 15989, 15973, 16111, 18171, + 18622, 20229, 21240, 21487, + 21403, 20895, 20697, 21116, + 21125, 21054, 20913, 21248, + 21322, 21290, 21305, 21086, + 21049, 21078, 21178, 21322, + 21325, 21495, 21752, 22112, + 22148, 22387, 22519, 22836, + 22860, 23051, 23166, 23447, + 23522, 23611, 23836, 23984, + 24068, 24079, 24208, 24387, + 24332, 24466, 24537, 24627, + 24677, 24735, 24764, 25766, + // QP = 8 NEW + 0, 0, 0, 0, + 0, 0, 9513, 11784, + 12142, 13291, 14070, 14500, + 14519, 14503, 14642, 16742, + 17200, 18832, 19854, 20099, + 20014, 19498, 19297, 19720, + 19731, 19657, 19515, 19853, + 19926, 19893, 19907, 19687, + 19649, 19679, 19780, 19927, + 19930, 20102, 20362, 20726, + 20763, 21005, 21136, 21458, + 21482, 21675, 21791, 22074, + 22150, 22239, 22467, 22616, + 22699, 22712, 22840, 23022, + 22965, 23100, 23173, 23262, + 23313, 23371, 23401, 24404, + // QP = 9 + 0, 0, 0, 0, + 0, 0, 8757, 10863, + 11200, 12284, 13028, 13441, + 13460, 13449, 13589, 15669, + 16127, 17751, 18769, 19008, + 18923, 18408, 18205, 18625, + 18634, 18561, 18418, 18753, + 18828, 18795, 18807, 18587, + 18548, 18575, 18676, 18822, + 18826, 18997, 19255, 19619, + 19654, 19896, 20028, 20348, + 20372, 20564, 20679, 20963, + 21037, 21126, 21353, 21502, + 21584, 21596, 21725, 21906, + 21850, 21983, 22057, 22147, + 22195, 22254, 22284, 23283, + // QP = 10 NEW + + 0, 0, 0, 0, + 0, 0, 7397, 9510, + 9849, 10958, 11724, 12152, + 12174, 12162, 12304, 14418, + 14880, 16525, 17551, 17785, + 17697, 17172, 16963, 17382, + 17391, 17317, 17173, 17510, + 17585, 17553, 17566, 17348, + 17308, 17339, 17440, 17588, + 17592, 17764, 18025, 18389, + 18425, 18667, 18799, 19121, + 19145, 19337, 19453, 19735, + 19811, 19901, 20127, 20276, + 20361, 20370, 20500, 20680, + 20624, 20757, 20830, 20920, + 20969, 21028, 21057, 22059, + // QP = 11 NEW + 0, 0, 0, 0, + 0, 0, 6115, 8119, + 8448, 9531, 10277, 10703, + 10726, 10716, 10862, 13003, + 13473, 15143, 16186, 16425, + 16335, 15800, 15587, 16006, + 16015, 15936, 15787, 16125, + 16201, 16167, 16181, 15959, + 15919, 15949, 16052, 16201, + 16205, 16379, 16643, 17012, + 17049, 17293, 17427, 17753, + 17775, 17971, 18089, 18375, + 18449, 18540, 18769, 18922, + 19006, 19015, 19146, 19329, + 19273, 19408, 19481, 19571, + 19620, 19679, 19709, 20724, + + // QP = 12 NEW + 0, 0, 0, 0, + 0, 0, 5252, 7138, + 7459, 8506, 9229, 9649, + 9671, 9663, 9813, 11944, + 12414, 14077, 15119, 15365, + 15276, 14745, 14532, 14951, + 14960, 14880, 14730, 15065, + 15140, 15105, 15117, 14895, + 14855, 14885, 14988, 15136, + 15139, 15314, 15578, 15944, + 15982, 16227, 16360, 16686, + 16709, 16904, 17022, 17309, + 17384, 17473, 17705, 17854, + 17939, 17949, 18080, 18263, + 18206, 18341, 18416, 18505, + 18554, 18613, 18644, 19661, + + // QP = 13 NEW + 0, 0, 0, 0, + 0, 0, 4362, 6083, + 6381, 7376, 8070, 8477, + 8501, 8497, 8654, 10759, + 11223, 12872, 13908, 14159, + 14073, 13550, 13343, 13759, + 13770, 13689, 13539, 13871, + 13947, 13909, 13919, 13694, + 13653, 13681, 13782, 13927, + 13931, 14103, 14365, 14731, + 14769, 15011, 15144, 15469, + 15492, 15686, 15803, 16089, + 16164, 16254, 16483, 16634, + 16717, 16728, 16860, 17041, + 16982, 17119, 17193, 17282, + 17332, 17391, 17421, 18442, + + // QP = 14 + 0, 0, 0, 0, + 0, 0, 3448, 4986, + 5252, 6165, 6825, 7218, + 7242, 7246, 7404, 9462, + 9917, 11539, 12565, 12826, + 12742, 12232, 12031, 12452, + 12461, 12382, 12233, 12563, + 12640, 12601, 12608, 12376, + 12336, 12360, 12457, 12598, + 12601, 12771, 13030, 13394, + 13431, 13673, 13805, 14127, + 14150, 14343, 14461, 14745, + 14820, 14910, 15139, 15289, + 15374, 15384, 15515, 15699, + 15639, 15774, 15848, 15939, + 15987, 16047, 16078, 17105, + + // QP = 15 NEW + 0, 0, 0, 0, + 0, 0, 2694, 4201, + 4438, 5283, 5894, 6259, + 6284, 6296, 6451, 8442, + 8883, 10461, 11463, 11729, + 11648, 11161, 10973, 11386, + 11395, 11322, 11178, 11505, + 11581, 11542, 11548, 11314, + 11274, 11293, 11386, 11519, + 11521, 11687, 11940, 12297, + 12333, 12569, 12698, 13016, + 13037, 13227, 13343, 13622, + 13696, 13784, 14012, 14158, + 14243, 14251, 14381, 14562, + 14505, 14639, 14712, 14801, + 14852, 14909, 14940, 15967, + + // QP = 16 NEW + 0, 0, 0, 0, + 0, 0, 1798, 3038, + 3259, 4010, 4575, 4973, + 4994, 5035, 5185, 7159, + 7590, 9156, 10154, 10429, + 10350, 9874, 9691, 10106, + 10117, 10042, 9903, 10231, + 10305, 10266, 10272, 10034, + 9993, 10009, 10099, 10226, + 10228, 10391, 10643, 10994, + 11032, 11267, 11395, 11711, + 11732, 11922, 12035, 12315, + 12389, 12476, 12701, 12849, + 12935, 12942, 13073, 13253, + 13195, 13329, 13403, 13490, + 13543, 13600, 13631, 14672, + + // QP = 17 NEW + 0, 0, 0, 0, + 0, 0, 1179, 2079, + 2231, 2726, 2954, 3449, + 3505, 3620, 3838, 5806, + 6225, 7771, 8751, 9036, + 8968, 8503, 8335, 8755, + 8770, 8701, 8566, 8899, + 8970, 8941, 8944, 8707, + 8666, 8679, 8764, 8885, + 8887, 9045, 9293, 9637, + 9670, 9900, 10027, 10336, + 10357, 10544, 10655, 10929, + 11002, 11089, 11309, 11456, + 11541, 11547, 11679, 11858, + 11797, 11931, 12005, 12092, + 12145, 12201, 12232, 13285, + + // QP = 18 NEW + 0, 0, 0, 0, + 0, 0, 916, 1661, + 1767, 2096, 2049, 2022, + 2028, 2223, 2513, 4678, + 5145, 6780, 7769, 8045, + 7974, 7493, 7307, 7726, + 7747, 7679, 7536, 7890, + 7964, 7952, 7967, 7769, + 7725, 7758, 7857, 7998, + 8009, 8165, 8412, 8769, + 8795, 9028, 9151, 9460, + 9477, 9664, 9771, 10042, + 10110, 10199, 10413, 10558, + 10642, 10650, 10778, 10951, + 10893, 11025, 11095, 11183, + 11234, 11290, 11319, 12364, + + // QP = 19 NEW + 0, 0, 0, 0, + 0, 0, 542, 1148, + 1245, 1526, 1487, 1384, + 1361, 1477, 1698, 3622, + 4078, 5620, 6583, 6847, + 6773, 6303, 6124, 6529, + 6546, 6467, 6333, 6655, + 6731, 6712, 6712, 6514, + 6461, 6494, 6610, 6750, + 6765, 6927, 7178, 7536, + 7557, 7807, 7933, 8242, + 8252, 8442, 8548, 8811, + 8887, 8972, 9181, 9327, + 9410, 9414, 9543, 9715, + 9661, 9792, 9859, 9950, + 9996, 10055, 10084, 11139, + + // QP = 20 NEW + 0, 0, 0, 0, + 0, 0, 452, 957, + 729, 949, 1036, 1145, + 1146, 1291, 1514, 2966, + 3294, 4394, 5166, 5627, + 5612, 5435, 5459, 6029, + 6061, 6081, 6062, 6392, + 6459, 6467, 6465, 6331, + 6293, 6334, 6437, 6570, + 6584, 6724, 6941, 7248, + 7265, 7475, 7587, 7836, + 7859, 8017, 8103, 8324, + 8377, 8457, 8620, 8752, + 8813, 8825, 8918, 9078, + 9040, 9138, 9204, 9280, + 9310, 9358, 9389, 10165, + + // QP = 21 NEW + 0, 0, 0, 0, + 0, 0, 376, 797, + 426, 590, 722, 947, + 965, 1129, 1350, 2429, + 2660, 3435, 4054, 4625, + 4649, 4687, 4867, 5566, + 5612, 5719, 5802, 6139, + 6197, 6231, 6226, 6153, + 6129, 6178, 6269, 6395, + 6408, 6527, 6712, 6970, + 6984, 7158, 7255, 7450, + 7484, 7613, 7680, 7863, + 7897, 7972, 8093, 8213, + 8254, 8273, 8334, 8483, + 8459, 8527, 8593, 8655, + 8670, 8709, 8741, 9277, + + // QP = 22 NEW + 0, 0, 0, 0, + 0, 0, 314, 664, + 249, 366, 503, 783, + 812, 987, 1204, 1989, + 2149, 2685, 3182, 3801, + 3852, 4041, 4339, 5140, + 5196, 5378, 5553, 5896, + 5947, 6003, 5997, 5980, + 5969, 6026, 6105, 6224, + 6236, 6336, 6490, 6704, + 6713, 6854, 6939, 7084, + 7128, 7229, 7280, 7429, + 7444, 7515, 7598, 7707, + 7731, 7755, 7788, 7928, + 7915, 7958, 8022, 8072, + 8075, 8105, 8138, 8466, + + // QP = 23 NEW + 0, 0, 0, 0, + 0, 0, 261, 554, + 146, 228, 350, 648, + 684, 863, 1074, 1629, + 1735, 2099, 2497, 3124, + 3192, 3485, 3868, 4746, + 4811, 5057, 5315, 5662, + 5706, 5784, 5776, 5812, + 5814, 5877, 5946, 6058, + 6069, 6151, 6276, 6447, + 6454, 6563, 6636, 6735, + 6788, 6865, 6901, 7018, + 7017, 7084, 7134, 7233, + 7240, 7270, 7278, 7408, + 7407, 7426, 7489, 7529, + 7520, 7543, 7577, 7726, + + // QP = 24 NEW + 0, 0, 0, 0, + 0, 0, 218, 461, + 85, 142, 244, 536, + 576, 755, 958, 1334, + 1402, 1641, 1960, 2567, + 2644, 3005, 3448, 4382, + 4455, 4756, 5087, 5438, + 5475, 5573, 5563, 5649, + 5662, 5732, 5790, 5896, + 5907, 5971, 6068, 6200, + 6204, 6284, 6346, 6403, + 6465, 6519, 6541, 6630, + 6614, 6678, 6697, 6787, + 6781, 6815, 6801, 6923, + 6930, 6930, 6991, 7022, + 7004, 7020, 7055, 7050, + + // QP = 25 NEW + 0, 0, 0, 0, + 0, 7, 19, 48, + 50, 88, 170, 443, + 485, 660, 854, 1092, + 1132, 1283, 1538, 2110, + 2191, 2591, 3074, 4046, + 4125, 4472, 4869, 5223, + 5254, 5369, 5358, 5490, + 5515, 5591, 5639, 5739, + 5749, 5796, 5868, 5963, + 5964, 6017, 6069, 6088, + 6157, 6191, 6200, 6263, + 6235, 6295, 6288, 6369, + 6351, 6389, 6356, 6469, + 6485, 6467, 6527, 6549, + 6523, 6533, 6568, 6434, + + // QP = 26 NEW + 0, 0, 0, 0, + 0, 2, 12, 29, + 30, 53, 105, 283, + 312, 427, 547, 665, + 688, 779, 939, 1306, + 1368, 1691, 2049, 2499, + 2514, 2684, 3153, 3834, + 3904, 4189, 4290, 4491, + 4525, 4616, 4670, 4774, + 4786, 4830, 4900, 4991, + 4994, 5042, 5092, 5118, + 5181, 5213, 5226, 5284, + 5262, 5315, 5314, 5395, + 5375, 5408, 5390, 5488, + 5504, 5491, 5546, 5570, + 5553, 5558, 5590, 5504, + + // QP = 27 NEW + 0, 0, 0, 0, + 0, 2, 9, 20, + 20, 35, 70, 190, + 209, 286, 359, 385, + 384, 393, 484, 662, + 712, 968, 1221, 1573, + 1587, 1801, 2134, 2454, + 2505, 2685, 2843, 3315, + 3389, 3633, 3793, 3968, + 3984, 4036, 4110, 4205, + 4205, 4255, 4304, 4332, + 4386, 4419, 4433, 4492, + 4477, 4522, 4530, 4603, + 4583, 4616, 4602, 4693, + 4707, 4702, 4745, 4770, + 4759, 4766, 4795, 4750, + + // QP = 28 NEW + 0, 0, 0, 0, + 0, 1, 7, 15, + 15, 24, 49, 132, + 145, 197, 245, 248, + 243, 230, 276, 379, + 412, 570, 733, 1049, + 1069, 1175, 1285, 1532, + 1586, 1759, 1918, 2225, + 2276, 2507, 2752, 3096, + 3114, 3240, 3344, 3460, + 3463, 3518, 3571, 3606, + 3650, 3684, 3704, 3760, + 3746, 3788, 3800, 3872, + 3854, 3885, 3877, 3961, + 3973, 3972, 4010, 4031, + 4032, 4037, 4067, 4060, + + // QP = 29 NEW + 0, 0, 0, 0, + 0, 2, 6, 11, + 11, 18, 36, 94, + 103, 139, 171, 169, + 165, 151, 179, 245, + 263, 363, 462, 673, + 696, 790, 868, 1058, + 1097, 1227, 1368, 1612, + 1652, 1818, 2013, 2315, + 2335, 2471, 2595, 2743, + 2753, 2818, 2881, 2923, + 2963, 2994, 3022, 3074, + 3067, 3105, 3120, 3186, + 3167, 3199, 3201, 3272, + 3283, 3287, 3321, 3340, + 3348, 3350, 3377, 3410, + + // QP = 30 NEW + 0, 0, 0, 0, + 0, 0, 5, 9, + 9, 14, 28, 71, + 77, 104, 126, 123, + 120, 108, 128, 176, + 188, 257, 322, 473, + 496, 555, 585, 737, + 775, 902, 1049, 1262, + 1293, 1425, 1590, 1842, + 1865, 1994, 2118, 2279, + 2297, 2371, 2451, 2514, + 2548, 2589, 2620, 2679, + 2677, 2714, 2729, 2789, + 2777, 2809, 2809, 2881, + 2887, 2891, 2920, 2936, + 2958, 2954, 2978, 3037, + + // QP = 31 NEW + 0, 0, 0, 0, + 0, 1, 4, 8, + 7, 11, 21, 52, + 57, 75, 91, 87, + 85, 76, 90, 122, + 129, 175, 219, 328, + 346, 395, 404, 511, + 537, 628, 759, 937, + 968, 1073, 1197, 1400, + 1418, 1520, 1622, 1771, + 1783, 1855, 1933, 2004, + 2030, 2070, 2114, 2175, + 2177, 2210, 2232, 2289, + 2277, 2305, 2313, 2378, + 2384, 2390, 2414, 2428, + 2454, 2450, 2475, 2562, + + // QP = 32 NEW + 0, 0, 0, 0, + 0, 0, 3, 6, + 6, 9, 16, 39, + 42, 55, 66, 63, + 61, 55, 65, 87, + 92, 123, 154, 234, + 247, 285, 289, 367, + 386, 456, 563, 704, + 728, 808, 906, 1061, + 1083, 1160, 1245, 1369, + 1376, 1443, 1516, 1590, + 1611, 1650, 1694, 1756, + 1763, 1793, 1815, 1870, + 1861, 1887, 1899, 1955, + 1959, 1968, 1986, 2004, + 2031, 2027, 2048, 2152, + + // QP = 33 NEW + 0, 0, 0, 0, + 0, 1, 3, 5, + 5, 7, 13, 30, + 32, 42, 50, 47, + 45, 41, 48, 65, + 68, 90, 113, 172, + 183, 211, 212, 271, + 285, 338, 426, 533, + 557, 619, 696, 818, + 835, 898, 966, 1067, + 1077, 1131, 1195, 1273, + 1286, 1329, 1381, 1443, + 1454, 1486, 1507, 1561, + 1553, 1580, 1592, 1641, + 1646, 1656, 1671, 1688, + 1713, 1712, 1733, 1841, + + // QP = 34 NEW + 0, 0, 0, 0, + 0, 0, 2, 4, + 4, 6, 10, 23, + 25, 32, 38, 35, + 34, 31, 36, 49, + 52, 68, 85, 130, + 139, 161, 161, 205, + 216, 258, 330, 414, + 435, 482, 546, 642, + 654, 705, 757, 840, + 847, 894, 949, 1017, + 1028, 1074, 1118, 1195, + 1199, 1239, 1262, 1318, + 1315, 1339, 1352, 1398, + 1402, 1410, 1425, 1440, + 1467, 1466, 1483, 1591, + + // QP = 35 NEW + 0, 0, 0, 0, + 0, 0, 2, 3, + 3, 5, 8, 19, + 20, 25, 30, 27, + 26, 23, 28, 38, + 41, 53, 66, 101, + 107, 125, 124, 160, + 169, 203, 262, 331, + 348, 387, 441, 523, + 529, 569, 616, 685, + 692, 729, 774, 838, + 841, 877, 925, 995, + 1004, 1051, 1076, 1132, + 1137, 1164, 1180, 1223, + 1228, 1237, 1249, 1266, + 1293, 1288, 1309, 1419, + + // QP = 36 NEW + 0, 0, 0, 0, + 0, 1, 1, 3, + 3, 4, 7, 15, + 16, 20, 23, 21, + 20, 18, 22, 30, + 32, 41, 51, 77, + 82, 96, 95, 124, + 130, 158, 204, 261, + 275, 307, 353, 422, + 428, 465, 503, 562, + 568, 601, 641, 700, + 700, 733, 772, 835, + 842, 887, 911, 961, + 972, 994, 1015, 1056, + 1060, 1072, 1083, 1099, + 1124, 1125, 1142, 1246, + + // QP = 37 NEW + 0, 0, 0, 0, + 0, 1, 1, 2, + 2, 3, 6, 12, + 13, 16, 19, 17, + 16, 15, 17, 24, + 26, 33, 41, 62, + 66, 77, 76, 98, + 104, 127, 165, 211, + 223, 250, 290, 349, + 356, 388, 422, 474, + 483, 511, 547, 604, + 602, 632, 668, 725, + 735, 772, 796, 840, + 853, 874, 894, 929, + 937, 951, 960, 977, + 999, 1001, 1018, 1120, + + // QP = 38 NEW + 0, 0, 0, 0, + 0, 0, 1, 2, + 2, 3, 5, 10, + 11, 13, 15, 14, + 13, 12, 14, 19, + 20, 26, 33, 48, + 51, 59, 58, 76, + 80, 98, 127, 163, + 174, 195, 229, 277, + 283, 310, 339, 383, + 392, 417, 448, 499, + 497, 524, 556, 605, + 615, 646, 669, 706, + 718, 736, 757, 787, + 795, 808, 816, 833, + 852, 853, 871, 965, + + // QP = 39 NEW + 0, 0, 0, 0, + 0, 1, 1, 2, + 2, 2, 4, 8, + 9, 11, 12, 11, + 11, 9, 11, 16, + 17, 21, 26, 39, + 41, 47, 46, 60, + 63, 77, 101, 130, + 137, 154, 183, 225, + 230, 252, 278, 317, + 326, 351, 376, 427, + 424, 447, 479, 524, + 534, 562, 583, 618, + 630, 647, 668, 698, + 703, 718, 727, 745, + 761, 763, 779, 873, + + // QP = 40 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 2, 3, 7, + 7, 9, 10, 9, + 8, 8, 9, 13, + 14, 17, 21, 30, + 32, 37, 36, 46, + 48, 59, 77, 99, + 105, 119, 141, 175, + 178, 200, 220, 251, + 261, 280, 301, 348, + 344, 365, 395, 432, + 440, 464, 488, 517, + 528, 544, 563, 592, + 597, 610, 620, 637, + 652, 655, 671, 759, + + // QP = 41 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 2, 3, 6, + 6, 7, 8, 7, + 7, 6, 7, 10, + 11, 14, 17, 25, + 26, 30, 29, 36, + 38, 46, 61, 77, + 82, 92, 111, 137, + 141, 157, 174, 201, + 209, 227, 243, 286, + 280, 299, 326, 359, + 368, 390, 408, 437, + 446, 461, 481, 511, + 515, 529, 539, 556, + 571, 577, 591, 679, + + // QP = 42 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 5, + 5, 6, 7, 6, + 6, 5, 6, 8, + 9, 11, 14, 20, + 20, 23, 22, 28, + 29, 35, 47, 58, + 63, 70, 85, 105, + 108, 122, 133, 156, + 162, 177, 188, 225, + 220, 235, 259, 286, + 296, 314, 328, 353, + 363, 375, 395, 421, + 426, 440, 448, 469, + 478, 490, 500, 588, + + // QP = 43 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 4, + 4, 5, 6, 5, + 5, 4, 5, 7, + 7, 9, 11, 16, + 17, 19, 18, 23, + 24, 28, 38, 46, + 49, 55, 67, 83, + 85, 97, 105, 123, + 128, 141, 149, 180, + 176, 188, 209, 230, + 239, 256, 268, 290, + 297, 311, 328, 349, + 356, 367, 377, 396, + 404, 418, 430, 521, + + // QP = 44 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 3, + 3, 4, 5, 4, + 4, 3, 4, 6, + 6, 8, 9, 13, + 13, 15, 14, 18, + 19, 22, 29, 36, + 38, 43, 51, 64, + 66, 75, 82, 96, + 100, 110, 115, 140, + 137, 146, 163, 180, + 189, 200, 211, 228, + 234, 247, 261, 279, + 282, 295, 301, 320, + 328, 341, 349, 437, + + // QP = 45 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 1, 3, + 3, 3, 4, 3, + 3, 3, 3, 5, + 5, 6, 7, 10, + 10, 12, 11, 14, + 14, 17, 23, 28, + 29, 33, 40, 49, + 51, 59, 63, 74, + 78, 85, 89, 110, + 106, 114, 128, 141, + 147, 157, 166, 180, + 186, 196, 208, 223, + 226, 238, 242, 260, + 266, 278, 288, 371, + + // QP = 46 NEW + 0, 0, 0, 0, + 0, 0, 0, 1, + 1, 1, 1, 2, + 2, 3, 3, 3, + 3, 2, 3, 4, + 4, 5, 6, 8, + 8, 10, 9, 11, + 12, 14, 18, 22, + 23, 26, 31, 39, + 41, 46, 50, 57, + 61, 67, 70, 86, + 84, 91, 102, 111, + 117, 125, 131, 143, + 149, 157, 167, 179, + 180, 191, 197, 212, + 215, 226, 235, 312, + + // QP = 47 NEW + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 1, 1, 2, + 2, 2, 3, 2, + 2, 2, 2, 3, + 3, 4, 5, 7, + 7, 8, 7, 9, + 9, 11, 15, 18, + 18, 20, 25, 31, + 32, 36, 39, 46, + 48, 52, 55, 68, + 66, 71, 80, 88, + 92, 97, 103, 113, + 117, 123, 133, 143, + 145, 154, 158, 170, + 174, 184, 189, 260, + + // QP = 48 NEW + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 1, 1, 2, + 2, 2, 2, 2, + 2, 2, 2, 3, + 3, 3, 4, 5, + 5, 6, 6, 7, + 8, 9, 12, 14, + 15, 16, 20, 24, + 25, 29, 31, 36, + 38, 41, 44, 54, + 52, 56, 64, 70, + 73, 77, 82, 91, + 94, 100, 106, 115, + 116, 124, 129, 138, + 141, 150, 155, 218, + + // QP = 49 NEW + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 2, 2, 2, + 1, 1, 2, 2, + 2, 3, 3, 4, + 4, 5, 5, 6, + 6, 7, 9, 11, + 12, 13, 16, 19, + 20, 23, 25, 29, + 30, 33, 35, 43, + 41, 45, 50, 55, + 59, 61, 65, 73, + 76, 80, 86, 92, + 93, 99, 104, 112, + 114, 121, 127, 181, + + // QP = 50 + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 1, + 1, 1, 1, 2, + 2, 2, 3, 4, + 4, 4, 4, 5, + 5, 6, 8, 9, + 10, 11, 13, 16, + 16, 18, 20, 23, + 24, 26, 28, 35, + 32, 35, 40, 44, + 46, 48, 52, 57, + 60, 64, 67, 73, + 74, 79, 83, 90, + 91, 97, 102, 148, + + // QP = 51 + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1, + 1, 1, 1, 1, + 1, 1, 1, 2, + 2, 2, 2, 3, + 3, 4, 3, 4, + 4, 5, 6, 7, + 8, 9, 11, 13, + 14, 15, 16, 19, + 20, 21, 22, 28, + 26, 29, 32, 35, + 38, 39, 42, 46, + 49, 52, 54, 60, + 61, 64, 67, 73, + 73, 77, 83, 122, +}; + + + +static const EB_Bit_Number initialRateControlIntraSad64x64Tables[] = { + // QP = 0 NEW + 0, 0, 0, 0, + 0, 0, 0, 22636, + 22804, 23718, 23852, 24210, + 23882, 24027, 24723, 25937, + 24896, 27051, 30603, 31453, + 30784, 29404, 30546, 31836, + 32090, 31576, 31532, 32354, + 31761, 32869, 32349, 31100, + 32368, 32773, 31148, 31299, + 32400, 31203, 32530, 33114, + 31942, 32664, 33074, 32774, + 32967, 33796, 34026, 33873, + 34018, 33566, 33505, 33776, + 34656, 33412, 33047, 34654, + 34543, 33790, 34751, 34184, + 34744, 34563, 34510, 35474, + // QP = 1 NEW + 0, 0, 0, 0, + 0, 0, 0, 21659, + 21816, 22686, 22860, 23146, + 22961, 22904, 23810, 24897, + 23850, 26033, 29440, 30276, + 29599, 28297, 29378, 30650, + 30930, 30445, 30407, 31191, + 30586, 31676, 31198, 30016, + 31223, 31615, 30048, 30194, + 31185, 30078, 31338, 31915, + 30882, 31510, 31926, 31660, + 31791, 32623, 32868, 32707, + 32824, 32408, 32327, 32611, + 33459, 32300, 31943, 33432, + 33331, 32635, 33511, 33026, + 33511, 33404, 33292, 34267, + // QP = 2 + 0, 0, 0, 0, + 0, 0, 0, 20399, + 20567, 21406, 21530, 21929, + 21604, 21684, 22474, 23556, + 22611, 24706, 28076, 28899, + 28275, 26929, 28047, 29297, + 29548, 29095, 29020, 29833, + 29249, 30324, 29833, 28626, + 29780, 30181, 28604, 28818, + 29824, 28750, 29998, 30512, + 29412, 30121, 30537, 30248, + 30429, 31252, 31414, 31288, + 31421, 30982, 30933, 31208, + 32051, 30854, 30518, 31943, + 31952, 31237, 32142, 31609, + 32102, 31959, 31906, 32837, + // QP = 3 + 0, 0, 0, 0, + 0, 0, 0, 19278, + 19449, 20318, 20495, 20815, + 20537, 20503, 21392, 22463, + 21541, 23616, 26914, 27740, + 27129, 25796, 26901, 28122, + 28442, 27938, 27874, 28713, + 28091, 29162, 28709, 27509, + 28679, 29114, 27560, 27700, + 28685, 27664, 28835, 29447, + 28371, 28998, 29423, 29193, + 29293, 30094, 30347, 30154, + 30299, 29876, 29795, 30090, + 30902, 29774, 29426, 30865, + 30778, 30106, 30959, 30464, + 30976, 30850, 30753, 31702, + // QP = 4 + 0, 0, 0, 0, + 0, 0, 0, 18171, + 18354, 19219, 19332, 19723, + 19474, 19490, 20348, 21392, + 20368, 22505, 25809, 26611, + 25991, 24661, 25761, 26942, + 27288, 26798, 26731, 27550, + 26911, 28042, 27558, 26384, + 27526, 27936, 26419, 26553, + 27574, 26480, 27685, 28267, + 27204, 27832, 28294, 28032, + 28155, 28976, 29137, 28959, + 29115, 28814, 28717, 28962, + 29719, 28627, 28291, 29654, + 29652, 28941, 29761, 29304, + 29797, 29674, 29572, 30538, + // QP = 5 + 0, 0, 0, 0, + 0, 0, 0, 17304, + 17457, 18373, 18467, 18776, + 18583, 18576, 19376, 20392, + 19573, 21570, 24793, 25581, + 24983, 23657, 24776, 25934, + 26202, 25721, 25718, 26507, + 25892, 26948, 26449, 25395, + 26469, 26895, 25391, 25548, + 26495, 25496, 26647, 27165, + 26147, 26758, 27200, 26942, + 27075, 27839, 28026, 27878, + 28012, 27638, 27560, 27891, + 28602, 27515, 27171, 28499, + 28483, 27837, 28660, 28174, + 28676, 28553, 28469, 29365, + // QP = 6 + 0, 0, 0, 0, + 0, 0, 0, 15929, + 16089, 16985, 17125, 17491, + 17251, 17283, 18054, 19104, + 18314, 20221, 23516, 24335, + 23720, 22396, 23479, 24639, + 24980, 24523, 24413, 25215, + 24647, 25710, 25220, 24072, + 25195, 25631, 24133, 24282, + 25225, 24149, 25378, 25927, + 24881, 25491, 25929, 25656, + 25833, 26621, 26803, 26604, + 26773, 26352, 26292, 26584, + 27341, 26252, 25940, 27300, + 27286, 26603, 27454, 26947, + 27432, 27279, 27167, 28112, + // QP = 7 + 0, 0, 0, 0, + 0, 0, 0, 14880, + 15069, 15956, 16137, 16474, + 16195, 16274, 17013, 18093, + 17175, 19187, 22485, 23231, + 22634, 21368, 22434, 23566, + 23858, 23427, 23355, 24114, + 23568, 24595, 24112, 23011, + 24110, 24575, 23075, 23184, + 24166, 23173, 24319, 24888, + 23815, 24442, 24833, 24637, + 24776, 25525, 25705, 25503, + 25659, 25296, 25215, 25490, + 26246, 25199, 24904, 26188, + 26180, 25489, 26316, 25833, + 26304, 26186, 26103, 27009, + // QP = 8 + 0, 0, 0, 0, + 0, 0, 0, 13746, + 13894, 14720, 14893, 15257, + 14973, 15025, 15803, 16851, + 15988, 17920, 21188, 21995, + 21377, 20093, 21107, 22309, + 22570, 22144, 22077, 22829, + 22295, 23282, 22820, 21751, + 22828, 23247, 21787, 21932, + 22876, 21875, 23024, 23546, + 22486, 23156, 23575, 23275, + 23442, 24200, 24380, 24242, + 24385, 23965, 23914, 24167, + 24947, 23860, 23570, 24889, + 24872, 24182, 25009, 24486, + 25011, 24872, 24812, 25682, + // QP = 9 NEW + 0, 0, 0, 0, + 0, 0, 0, 12644, + 12844, 13728, 13872, 14304, + 14018, 13956, 14863, 15842, + 14974, 16981, 20166, 20918, + 20330, 19073, 20106, 21294, + 21529, 21121, 21044, 21784, + 21235, 22283, 21797, 20747, + 21782, 22261, 20823, 20944, + 21863, 20876, 22020, 22541, + 21425, 22116, 22537, 22261, + 22440, 23180, 23345, 23186, + 23330, 22950, 22880, 23167, + 23891, 22853, 22545, 23817, + 23831, 23158, 23965, 23527, + 23957, 23852, 23782, 24640, + // QP = 10 NEW + + 0, 0, 0, 0, + 0, 0, 0, 11514, + 11684, 12528, 12643, 13059, + 12783, 12779, 13652, 14690, + 13845, 15753, 18925, 19726, + 19150, 17862, 18913, 20057, + 20354, 19916, 19866, 20598, + 20056, 21068, 20616, 19489, + 20567, 21018, 19535, 19650, + 20618, 19626, 20761, 21328, + 20235, 20913, 21289, 21021, + 21183, 21922, 22118, 21999, + 22111, 21710, 21680, 21946, + 22663, 21580, 21278, 22568, + 22616, 21924, 22754, 22227, + 22784, 22604, 22541, 23392, + // QP = 11 NEW + 0, 0, 0, 0, + 0, 0, 0, 10630, + 10786, 11619, 11781, 12167, + 11834, 11885, 12764, 13787, + 12899, 14895, 18047, 18837, + 18207, 16962, 17993, 19141, + 19397, 18970, 18891, 19631, + 19055, 20083, 19662, 18612, + 19654, 20150, 18668, 18764, + 19780, 18745, 19902, 20417, + 19290, 20002, 20427, 20163, + 20268, 21030, 21198, 21045, + 21230, 20798, 20725, 21031, + 21732, 20708, 20418, 21640, + 21691, 20988, 21828, 21315, + 21796, 21639, 21631, 22465, + + // QP = 12 NEW + 0, 0, 0, 0, + 0, 0, 0, 9344, + 9545, 10341, 10496, 10916, + 10660, 10698, 11527, 12506, + 11605, 13628, 16847, 17618, + 17024, 15743, 16781, 17898, + 18200, 17803, 17668, 18421, + 17851, 18901, 18406, 17358, + 18429, 18925, 17404, 17517, + 18516, 17530, 18701, 19254, + 18116, 18813, 19232, 18926, + 19081, 19815, 19993, 19899, + 20042, 19552, 19555, 19803, + 20554, 19543, 19182, 20473, + 20487, 19760, 20636, 20171, + 20629, 20462, 20377, 21271, + + // QP = 13 NEW + 0, 0, 0, 0, + 0, 0, 0, 8432, + 8573, 9428, 9562, 9983, + 9642, 9722, 10557, 11542, + 10651, 12611, 15744, 16537, + 15938, 14720, 15759, 16886, + 17132, 16736, 16634, 17395, + 16836, 17854, 17393, 16305, + 17394, 17815, 16345, 16498, + 17465, 16440, 17592, 18156, + 17035, 17698, 18106, 17828, + 17962, 18724, 18871, 18749, + 18871, 18503, 18497, 18697, + 19406, 18392, 18068, 19397, + 19393, 18734, 19512, 19065, + 19520, 19379, 19308, 20139, + + // QP = 14 NEW + 0, 0, 0, 0, + 0, 0, 0, 7285, + 7445, 8289, 8492, 8746, + 8455, 8574, 9369, 10346, + 9473, 11443, 14522, 15289, + 14716, 13523, 14566, 15683, + 15915, 15513, 15453, 16193, + 15665, 16634, 16164, 15107, + 16197, 16592, 15159, 15353, + 16256, 15203, 16417, 16928, + 15827, 16477, 16857, 16635, + 16703, 17512, 17632, 17548, + 17681, 17234, 17208, 17467, + 18197, 17164, 16858, 18147, + 18142, 17480, 18283, 17773, + 18286, 18110, 18084, 18902, + + // QP = 15 NEW + 0, 0, 0, 0, + 0, 0, 0, 6214, + 6406, 7229, 7436, 7675, + 7449, 7582, 8347, 9325, + 8482, 10387, 13458, 14232, + 13671, 12453, 13483, 14620, + 14823, 14430, 14398, 15153, + 14606, 15605, 15137, 14080, + 15145, 15569, 14115, 14300, + 15182, 14186, 15350, 15858, + 14756, 15452, 15763, 15516, + 15667, 16472, 16569, 16462, + 16563, 16178, 16134, 16424, + 17139, 16112, 15795, 17090, + 17063, 16422, 17253, 16707, + 17208, 17077, 17011, 17839, + + // QP = 16 NEW + 0, 0, 0, 0, + 0, 0, 0, 5089, + 5295, 6085, 6250, 6500, + 6352, 6344, 7187, 8204, + 7275, 9209, 12282, 13060, + 12449, 11293, 12320, 13458, + 13687, 13243, 13218, 13965, + 13458, 14422, 13950, 12890, + 13937, 14400, 12961, 13098, + 14038, 13030, 14174, 14678, + 13614, 14266, 14592, 14359, + 14528, 15266, 15432, 15313, + 15391, 15032, 14973, 15198, + 15971, 14933, 14689, 15883, + 15940, 15238, 16039, 15559, + 16021, 15913, 15859, 16669, + + // QP = 17 NEW + 0, 0, 0, 0, + 0, 0, 0, 4258, + 4410, 5177, 5338, 5619, + 5381, 5501, 6175, 7168, + 6335, 8238, 11256, 12062, + 11451, 10296, 11287, 12446, + 12658, 12254, 12223, 12948, + 12435, 13416, 12951, 11897, + 12955, 13370, 11964, 12147, + 13009, 12010, 13184, 13684, + 12626, 13289, 13645, 13353, + 13519, 14268, 14393, 14302, + 14362, 14079, 13991, 14218, + 14980, 13929, 13593, 14932, + 14914, 14211, 15021, 14514, + 15051, 14897, 14839, 15651, + + // QP = 18 NEW + 0, 0, 0, 0, + 0, 0, 0, 3353, + 3493, 4214, 4330, 4599, + 4420, 4486, 5191, 6224, + 5417, 7217, 10145, 10892, + 10338, 9231, 10181, 11268, + 11489, 11157, 11127, 11804, + 11248, 12314, 11820, 10808, + 11808, 12212, 10874, 11011, + 11873, 10888, 12050, 12523, + 11467, 12150, 12457, 12199, + 12363, 13104, 13245, 13158, + 13203, 12877, 12795, 13042, + 13775, 12697, 12444, 13776, + 13699, 13087, 13831, 13356, + 13842, 13685, 13659, 14495, + + // QP = 19 NEW + 0, 0, 0, 0, + 0, 0, 0, 2656, + 2789, 3394, 3522, 3849, + 3653, 3726, 4374, 5366, + 4579, 6257, 9138, 9873, + 9361, 8274, 9211, 10283, + 10512, 10161, 10125, 10819, + 10289, 11250, 10834, 9824, + 10812, 11198, 9848, 10057, + 10892, 9901, 11027, 11498, + 10424, 11180, 11421, 11178, + 11365, 12108, 12208, 12108, + 12181, 11846, 11802, 12052, + 12715, 11708, 11417, 12699, + 12698, 12094, 12816, 12368, + 12822, 12686, 12596, 13468, + + // QP = 20 NEW + 0, 0, 0, 0, + 0, 0, 0, 1940, + 2058, 2584, 2713, 3020, + 2842, 2981, 3498, 4392, + 3672, 5306, 8051, 8729, + 8210, 7210, 8107, 9179, + 9353, 8998, 9009, 9650, + 9133, 10105, 9694, 8749, + 9676, 10028, 8700, 8920, + 9732, 8790, 9903, 10317, + 9341, 10004, 10282, 10031, + 10174, 10903, 11012, 10965, + 10979, 10659, 10612, 10886, + 11532, 10521, 10271, 11524, + 11478, 10898, 11633, 11217, + 11601, 11546, 11426, 12284, + + // QP = 21 NEW + 0, 0, 0, 0, + 0, 0, 0, 1406, + 1508, 1943, 2045, 2362, + 2225, 2298, 2817, 3561, + 3002, 4491, 7094, 7752, + 7280, 6353, 7152, 8168, + 8358, 8050, 8010, 8731, + 8205, 9085, 8725, 7739, + 8685, 9004, 7794, 7939, + 8685, 7772, 8871, 9286, + 8443, 8992, 9232, 8986, + 9154, 9850, 10029, 9921, + 9928, 9675, 9598, 9874, + 10484, 9483, 9189, 10483, + 10406, 9902, 10581, 10189, + 10561, 10487, 10412, 11239, + + // QP = 22 NEW + 0, 0, 0, 0, + 0, 0, 0, 935, + 1011, 1343, 1472, 1733, + 1660, 1720, 2176, 2820, + 2348, 3666, 6111, 6765, + 6356, 5438, 6227, 7191, + 7333, 7061, 7035, 7716, + 7196, 8040, 7699, 6744, + 7653, 7934, 6760, 6927, + 7612, 6791, 7780, 8204, + 7379, 7950, 8184, 7917, + 8047, 8729, 8926, 8795, + 8828, 8569, 8493, 8741, + 9399, 8372, 8132, 9400, + 9335, 8789, 9462, 9097, + 9512, 9361, 9293, 10111, + + // QP = 23 NEW + 0, 0, 0, 0, + 0, 0, 0, 661, + 727, 969, 1068, 1324, + 1298, 1316, 1715, 2268, + 1927, 3027, 5217, 5826, + 5467, 4689, 5374, 6329, + 6449, 6197, 6175, 6850, + 6358, 7124, 6848, 5923, + 6775, 7011, 5927, 6044, + 6714, 5934, 6824, 7264, + 6566, 7040, 7216, 7010, + 7126, 7759, 8012, 7799, + 7878, 7670, 7532, 7778, + 8405, 7457, 7194, 8406, + 8305, 7845, 8424, 8076, + 8507, 8377, 8315, 9114, + + // QP = 24 NEW + 0, 0, 0, 0, + 0, 0, 0, 433, + 473, 640, 714, 997, + 974, 998, 1361, 1769, + 1582, 2469, 4379, 4973, + 4661, 4025, 4625, 5495, + 5638, 5381, 5373, 6007, + 5563, 6248, 6010, 5139, + 5912, 6132, 5076, 5265, + 5826, 5145, 5960, 6369, + 5749, 6104, 6263, 6131, + 6204, 6805, 7046, 6860, + 6895, 6746, 6630, 6825, + 7417, 6535, 6309, 7431, + 7362, 6959, 7490, 7128, + 7533, 7408, 7376, 8135, + + // QP = 25 NEW + 0, 0, 0, 0, + 0, 0, 0, 281, + 305, 428, 485, 759, + 712, 822, 1059, 1402, + 1277, 1989, 3535, 4091, + 3856, 3359, 3895, 4741, + 4823, 4637, 4664, 5243, + 4832, 5420, 5230, 4440, + 5157, 5255, 4338, 4474, + 5008, 4400, 5091, 5500, + 4920, 5251, 5424, 5279, + 5343, 5856, 6172, 5972, + 5938, 5857, 5724, 5987, + 6459, 5649, 5452, 6503, + 6372, 6088, 6481, 6208, + 6612, 6534, 6456, 7192, + + // QP = 26 NEW + 0, 0, 0, 0, + 0, 0, 0, 168, + 182, 253, 312, 561, + 527, 587, 820, 1060, + 1007, 1533, 2640, 3168, + 2976, 2677, 3140, 3886, + 3925, 3845, 3906, 4416, + 4100, 4581, 4474, 3714, + 4320, 4428, 3600, 3747, + 4104, 3643, 4239, 4590, + 4103, 4338, 4537, 4414, + 4477, 4908, 5168, 4950, + 4978, 4908, 4813, 5028, + 5468, 4758, 4631, 5521, + 5401, 5183, 5452, 5219, + 5575, 5535, 5480, 6192, + + // QP = 27 NEW + 0, 0, 0, 0, + 0, 0, 0, 121, + 126, 162, 208, 427, + 399, 484, 653, 857, + 833, 1176, 1954, 2409, + 2279, 2121, 2491, 3184, + 3186, 3190, 3264, 3753, + 3454, 3896, 3796, 3155, + 3670, 3713, 3026, 3121, + 3433, 3044, 3567, 3811, + 3430, 3652, 3769, 3682, + 3733, 4154, 4365, 4131, + 4206, 4147, 4064, 4280, + 4619, 3989, 3880, 4674, + 4623, 4438, 4639, 4398, + 4764, 4760, 4683, 5368, + + // QP = 28 NEW + 0, 0, 0, 0, + 0, 0, 0, 88, + 87, 110, 147, 316, + 323, 365, 518, 645, + 697, 890, 1300, 1660, + 1589, 1580, 1857, 2407, + 2430, 2486, 2580, 3032, + 2800, 3167, 3123, 2566, + 2982, 3011, 2438, 2555, + 2710, 2473, 2877, 3069, + 2758, 2947, 3036, 3008, + 3012, 3348, 3507, 3381, + 3433, 3353, 3291, 3511, + 3734, 3254, 3196, 3810, + 3805, 3686, 3766, 3622, + 3874, 3949, 3861, 4527, + + // QP = 29 NEW + 0, 0, 0, 0, + 0, 0, 0, 70, + 70, 82, 105, 257, + 262, 314, 427, 515, + 577, 686, 849, 1113, + 1086, 1166, 1360, 1798, + 1803, 1922, 2021, 2412, + 2214, 2553, 2572, 2127, + 2416, 2399, 1972, 2044, + 2154, 2022, 2334, 2447, + 2152, 2391, 2448, 2424, + 2450, 2706, 2882, 2713, + 2737, 2732, 2682, 2810, + 3021, 2630, 2690, 3092, + 3118, 3042, 3067, 2908, + 3158, 3250, 3187, 3812, + + // QP = 30 NEW + 0, 0, 0, 0, + 0, 0, 0, 58, + 62, 65, 88, 217, + 223, 283, 355, 420, + 482, 553, 557, 776, + 767, 895, 1043, 1381, + 1376, 1483, 1600, 1979, + 1767, 2107, 2175, 1787, + 2037, 1943, 1627, 1710, + 1752, 1711, 1926, 2039, + 1819, 1987, 2059, 2071, + 2027, 2256, 2376, 2231, + 2257, 2290, 2300, 2343, + 2522, 2199, 2278, 2595, + 2641, 2613, 2566, 2501, + 2601, 2743, 2741, 3315, + + // QP = 31 NEW + 0, 0, 0, 0, + 0, 0, 0, 52, + 52, 57, 75, 176, + 189, 239, 295, 353, + 412, 438, 336, 475, + 488, 636, 742, 957, + 954, 1084, 1195, 1457, + 1355, 1587, 1640, 1445, + 1565, 1522, 1295, 1377, + 1349, 1412, 1541, 1597, + 1403, 1586, 1618, 1644, + 1636, 1759, 1887, 1745, + 1758, 1840, 1821, 1836, + 1945, 1757, 1857, 2028, + 2138, 2102, 2059, 2018, + 2065, 2198, 2204, 2733, + + // QP = 32 NEW + 0, 0, 0, 0, + 0, 0, 0, 46, + 44, 50, 69, 154, + 155, 198, 242, 290, + 335, 334, 189, 266, + 295, 428, 486, 608, + 612, 720, 823, 1013, + 936, 1104, 1173, 1119, + 1159, 1084, 1024, 1064, + 1014, 1101, 1176, 1197, + 1096, 1249, 1233, 1279, + 1268, 1360, 1426, 1326, + 1318, 1453, 1438, 1407, + 1490, 1344, 1505, 1539, + 1686, 1665, 1569, 1580, + 1625, 1698, 1766, 2206, + + // QP = 33 NEW + 0, 0, 0, 0, + 0, 0, 0, 43, + 40, 45, 60, 135, + 148, 175, 194, 228, + 290, 273, 121, 159, + 192, 308, 339, 408, + 399, 489, 575, 694, + 651, 753, 846, 873, + 866, 799, 810, 870, + 796, 898, 934, 950, + 872, 983, 1000, 1009, + 1001, 1048, 1082, 1023, + 1032, 1144, 1171, 1111, + 1145, 1066, 1242, 1204, + 1335, 1360, 1294, 1299, + 1281, 1328, 1440, 1815, + + // QP = 34 NEW + 0, 0, 0, 0, + 0, 0, 0, 37, + 35, 39, 55, 111, + 136, 140, 169, 190, + 249, 225, 86, 102, + 138, 239, 250, 262, + 270, 327, 405, 457, + 458, 512, 590, 678, + 636, 577, 651, 694, + 623, 738, 744, 741, + 699, 818, 803, 821, + 815, 833, 846, 825, + 812, 953, 932, 881, + 885, 856, 1040, 954, + 1069, 1077, 1039, 1062, + 1041, 1069, 1200, 1503, + + // QP = 35 NEW + 0, 0, 0, 0, + 0, 0, 0, 33, + 32, 35, 47, 109, + 114, 127, 147, 158, + 201, 195, 75, 87, + 112, 197, 209, 202, + 210, 253, 314, 346, + 355, 400, 456, 567, + 511, 466, 559, 612, + 524, 659, 638, 640, + 603, 711, 668, 734, + 695, 691, 701, 696, + 693, 817, 820, 736, + 750, 763, 919, 820, + 925, 920, 911, 940, + 892, 914, 1057, 1317, + + // QP = 36 NEW + 0, 0, 0, 0, + 0, 0, 0, 30, + 29, 32, 45, 85, + 95, 100, 121, 143, + 167, 164, 61, 71, + 92, 155, 166, 158, + 156, 195, 232, 246, + 271, 296, 335, 471, + 386, 363, 468, 508, + 441, 558, 542, 526, + 503, 613, 567, 614, + 586, 590, 582, 591, + 581, 697, 694, 619, + 611, 657, 784, 697, + 796, 771, 773, 785, + 767, 781, 883, 1131, + + // QP = 37 NEW + 0, 0, 0, 0, + 0, 0, 0, 28, + 28, 29, 39, 81, + 82, 102, 106, 119, + 140, 137, 55, 62, + 80, 142, 142, 136, + 134, 170, 202, 213, + 224, 247, 274, 402, + 322, 319, 406, 448, + 399, 499, 477, 466, + 459, 539, 490, 553, + 526, 510, 512, 532, + 520, 623, 624, 564, + 553, 587, 704, 609, + 723, 691, 682, 704, + 675, 680, 814, 1022, + + // QP = 38 NEW + 0, 0, 0, 0, + 0, 0, 0, 25, + 25, 26, 35, 70, + 67, 88, 90, 100, + 114, 117, 45, 52, + 67, 114, 112, 104, + 108, 133, 157, 167, + 174, 192, 214, 323, + 265, 250, 333, 373, + 340, 416, 388, 402, + 401, 453, 427, 465, + 456, 441, 441, 458, + 438, 522, 534, 490, + 484, 513, 603, 519, + 613, 587, 590, 608, + 602, 580, 696, 888, + + // QP = 39 NEW + 0, 0, 0, 0, + 0, 0, 0, 23, + 23, 24, 30, 60, + 60, 81, 82, 83, + 102, 104, 40, 47, + 60, 97, 101, 96, + 95, 122, 136, 145, + 160, 169, 185, 285, + 228, 214, 301, 323, + 301, 375, 362, 355, + 359, 406, 388, 416, + 422, 400, 397, 413, + 392, 471, 487, 451, + 432, 455, 543, 480, + 562, 536, 527, 560, + 550, 534, 639, 812, + + // QP = 40 NEW + 0, 0, 0, 0, + 0, 0, 0, 22, + 21, 22, 30, 59, + 56, 66, 69, 68, + 79, 83, 35, 41, + 50, 80, 87, 81, + 78, 100, 107, 116, + 130, 133, 152, 238, + 187, 185, 252, 279, + 256, 314, 302, 308, + 297, 341, 321, 365, + 366, 347, 345, 346, + 339, 403, 417, 392, + 379, 413, 477, 419, + 490, 455, 463, 474, + 480, 463, 562, 714, + + // QP = 41 NEW + 0, 0, 0, 0, + 0, 0, 0, 21, + 20, 23, 28, 56, + 51, 54, 56, 65, + 65, 66, 33, 36, + 45, 68, 75, 73, + 68, 88, 101, 100, + 107, 119, 134, 204, + 161, 161, 225, 248, + 234, 274, 273, 275, + 275, 306, 288, 338, + 322, 309, 318, 315, + 307, 353, 379, 348, + 352, 375, 425, 388, + 438, 420, 418, 427, + 450, 420, 497, 653, + + // QP = 42 NEW + 0, 0, 0, 0, + 0, 0, 0, 19, + 18, 19, 27, 41, + 44, 49, 47, 54, + 52, 59, 30, 31, + 37, 59, 64, 62, + 55, 76, 82, 84, + 89, 96, 114, 167, + 141, 144, 189, 216, + 197, 235, 228, 233, + 235, 272, 252, 287, + 283, 270, 277, 277, + 265, 319, 334, 300, + 305, 325, 376, 340, + 376, 366, 363, 375, + 396, 370, 447, 574, + + // QP = 43 NEW + 0, 0, 0, 0, + 0, 0, 0, 19, + 18, 19, 23, 40, + 39, 41, 46, 49, + 41, 48, 26, 28, + 32, 50, 51, 53, + 50, 61, 74, 75, + 80, 84, 97, 151, + 128, 124, 168, 186, + 182, 208, 205, 204, + 207, 235, 223, 251, + 260, 244, 241, 243, + 242, 284, 289, 284, + 280, 296, 332, 308, + 333, 324, 316, 341, + 361, 335, 404, 524, + + // QP = 44 NEW + 0, 0, 0, 0, + 0, 0, 0, 17, + 16, 18, 20, 35, + 34, 40, 41, 37, + 43, 45, 23, 25, + 30, 41, 43, 42, + 40, 55, 60, 62, + 66, 74, 80, 120, + 100, 105, 140, 150, + 149, 172, 171, 177, + 171, 196, 192, 209, + 220, 211, 202, 204, + 206, 253, 251, 240, + 239, 255, 286, 275, + 273, 281, 284, 283, + 307, 281, 334, 453, + + // QP = 45 NEW + 0, 0, 0, 0, + 0, 0, 0, 15, + 15, 16, 21, 33, + 33, 34, 32, 32, + 40, 37, 19, 22, + 25, 36, 37, 36, + 35, 47, 51, 49, + 56, 59, 68, 102, + 86, 93, 114, 136, + 123, 156, 138, 142, + 147, 160, 157, 179, + 194, 182, 184, 190, + 176, 218, 213, 212, + 200, 224, 249, 239, + 246, 244, 240, 254, + 280, 247, 302, 395, + + // QP = 46 NEW + 0, 0, 0, 0, + 0, 0, 0, 14, + 15, 15, 17, 31, + 32, 34, 32, 31, + 33, 30, 18, 20, + 22, 31, 33, 32, + 30, 39, 42, 43, + 44, 49, 60, 87, + 71, 77, 104, 110, + 110, 126, 119, 131, + 128, 137, 138, 155, + 164, 149, 153, 154, + 150, 190, 179, 182, + 182, 193, 210, 207, + 220, 217, 220, 212, + 234, 218, 259, 343, + + // QP = 47 NEW + 0, 0, 0, 0, + 0, 0, 0, 13, + 15, 15, 19, 30, + 30, 28, 29, 28, + 28, 27, 16, 18, + 19, 25, 29, 27, + 26, 33, 35, 38, + 38, 39, 51, 73, + 58, 62, 82, 97, + 97, 104, 97, 107, + 106, 110, 121, 130, + 145, 134, 129, 136, + 124, 152, 153, 161, + 160, 163, 180, 182, + 185, 184, 183, 188, + 202, 183, 221, 297, + + // QP = 48 NEW + 0, 0, 0, 0, + 0, 0, 0, 12, + 12, 13, 17, 27, + 26, 29, 25, 26, + 26, 24, 15, 17, + 17, 24, 26, 25, + 28, 28, 30, 32, + 31, 35, 42, 58, + 50, 54, 65, 80, + 80, 87, 85, 93, + 87, 96, 100, 111, + 119, 118, 114, 117, + 115, 144, 127, 141, + 135, 145, 149, 158, + 158, 160, 151, 160, + 183, 160, 190, 259, + + // QP = 49 NEW + 0, 0, 0, 0, + 0, 0, 0, 11, + 12, 12, 16, 23, + 22, 23, 22, 23, + 23, 24, 13, 15, + 16, 21, 21, 22, + 22, 25, 28, 31, + 27, 29, 35, 46, + 45, 46, 58, 70, + 65, 74, 67, 80, + 78, 79, 80, 95, + 102, 100, 93, 97, + 95, 120, 106, 119, + 121, 128, 128, 142, + 132, 139, 137, 135, + 158, 139, 162, 223, + + // QP = 50 NEW + 0, 0, 0, 0, + 0, 0, 0, 11, + 11, 12, 15, 22, + 19, 22, 19, 20, + 21, 21, 14, 14, + 16, 18, 19, 19, + 20, 21, 23, 24, + 24, 26, 32, 40, + 36, 40, 49, 56, + 56, 59, 56, 69, + 68, 63, 73, 80, + 84, 86, 84, 81, + 79, 103, 88, 100, + 101, 105, 109, 124, + 109, 109, 113, 111, + 135, 120, 142, 191, + + // QP = 51 NEW + 0, 0, 0, 0, + 0, 0, 0, 10, + 11, 12, 14, 20, + 18, 22, 18, 21, + 21, 20, 11, 13, + 14, 17, 16, 16, + 19, 20, 24, 21, + 22, 24, 28, 33, + 34, 38, 42, 51, + 42, 49, 47, 59, + 62, 58, 62, 67, + 68, 66, 73, 73, + 65, 85, 78, 90, + 92, 101, 91, 107, + 96, 103, 96, 98, + 122, 104, 119, 166, +}; @@ -1878,12 +1878,12 @@ EB_ERRORTYPE RateControlTablesCtor( for (temporalIndex=0; temporalIndex < MAX_TEMPORAL_LAYERS; temporalIndex++){ if (intervalIndex < (NUMBER_OF_SAD_INTERVALS >> 1)){ // intrinsics used in initial RC are assuming signed 16 bits is the maximum - initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), (EB_U16)initialRateControlSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + intervalIndex]); - initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), (EB_U16)initialRateControlIntraSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + intervalIndex]); @@ -1891,11 +1891,11 @@ EB_ERRORTYPE RateControlTablesCtor( } else{ - initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), (EB_U16)initialRateControlSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + ((NUMBER_OF_SAD_INTERVALS >> 1) - 1)]); - initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), initialRateControlIntraSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + ((NUMBER_OF_SAD_INTERVALS >> 1) - 1)]); diff --git a/Source/Lib/Codec/EbRateControlTables.h b/Source/Lib/Codec/EbRateControlTables.h index 42698f70a..718a889d3 100644 --- a/Source/Lib/Codec/EbRateControlTables.h +++ b/Source/Lib/Codec/EbRateControlTables.h @@ -25,7 +25,7 @@ extern "C" { #define TOTAL_NUMBER_OF_INTERVALS (NUMBER_OF_SAD_INTERVALS + \ NUMBER_OF_INTRA_SAD_INTERVALS ) -#define TOTAL_NUMBER_OF_REF_QP_VALUES 1 +#define TOTAL_NUMBER_OF_REF_QP_VALUES 1 #define TOTAL_NUMBER_OF_INITIAL_RC_TABLES_ENTRY (TOTAL_NUMBER_OF_REF_QP_VALUES * TOTAL_NUMBER_OF_INTERVALS) @@ -43,10 +43,10 @@ typedef struct InitialRateControlTables_s { } RateControlTables_t; -static const EB_U8 refQpListTable [] = +static const EB_U8 refQpListTable [] = - { 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, + { 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, diff --git a/Source/Lib/Codec/EbRateControlTasks.h b/Source/Lib/Codec/EbRateControlTasks.h index 7e94007d4..3084c1d6f 100644 --- a/Source/Lib/Codec/EbRateControlTasks.h +++ b/Source/Lib/Codec/EbRateControlTasks.h @@ -38,7 +38,7 @@ typedef struct RateControlTasks_s EB_U16 tileIndex; EB_U32 rowNumber; EB_U32 bitCount; - + } RateControlTasks_t; typedef struct RateControlTasksInitData_s @@ -50,7 +50,7 @@ typedef struct RateControlTasksInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE RateControlTasksCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbRateDistortionCost.c b/Source/Lib/Codec/EbRateDistortionCost.c index 0cd414e69..4a6ea7ba9 100644 --- a/Source/Lib/Codec/EbRateDistortionCost.c +++ b/Source/Lib/Codec/EbRateDistortionCost.c @@ -17,17 +17,17 @@ static const EB_U32 interBiDirBits[8] = { 29856, 36028, 15752, 59703, 8692, 8442 static const EB_U32 interUniDirBits[2] = { 2742, 136034 }; static const EB_U32 mvpIndexBits[2] = { 23196, 44891 }; -#define WEIGHT_FACTOR_FOR_AURA_CU 4 +#define WEIGHT_FACTOR_FOR_AURA_CU 4 EB_ERRORTYPE MergeSkipFullLumaCost( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize); + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize); /********************************************************************************* * apply Weight on Chroma Distortion @@ -68,104 +68,104 @@ EB_U64 getWeightedChromaDistortion( * Coding Loop Context Generation ************************************************************/ void CodingLoopContextGeneration( - ModeDecisionContext_t *contextPtr, - CodingUnit_t *cuPtr, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *skipFlagNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *leafDepthNeighborArray) + ModeDecisionContext_t *contextPtr, + CodingUnit_t *cuPtr, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *skipFlagNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - cuOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - cuOriginX); - EB_U32 leafDepthLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - leafDepthNeighborArray, - cuOriginY); - EB_U32 leafDepthTopNeighborIndex = GetNeighborArrayUnitTopIndex( - leafDepthNeighborArray, - cuOriginX); - EB_U32 skipFlagLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - skipFlagNeighborArray, - cuOriginY); - EB_U32 skipFlagTopNeighborIndex = GetNeighborArrayUnitTopIndex( - skipFlagNeighborArray, - cuOriginX); - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - cuOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - cuOriginX); - - // Intra Luma Neighbor Modes - (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); - (&cuPtr->predictionUnitArray[0])->intraLumaTopMode = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - // Top Intra Mode Neighbor Array instead of a Full - // Skip Flag Context - cuPtr->skipFlagContext = - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (skipFlagNeighborArray->leftArray[skipFlagLeftNeighborIndex] == EB_TRUE) ? 1 : 0; - cuPtr->skipFlagContext += - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (skipFlagNeighborArray->topArray[skipFlagTopNeighborIndex] == EB_TRUE) ? 1 : 0; - - // Split Flag Context (neighbor info) - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth = leafDepthNeighborArray->leftArray[leafDepthLeftNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth = leafDepthNeighborArray->topArray[leafDepthTopNeighborIndex]; - - return; + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + cuOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + cuOriginX); + EB_U32 leafDepthLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + leafDepthNeighborArray, + cuOriginY); + EB_U32 leafDepthTopNeighborIndex = GetNeighborArrayUnitTopIndex( + leafDepthNeighborArray, + cuOriginX); + EB_U32 skipFlagLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + skipFlagNeighborArray, + cuOriginY); + EB_U32 skipFlagTopNeighborIndex = GetNeighborArrayUnitTopIndex( + skipFlagNeighborArray, + cuOriginX); + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + cuOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + cuOriginX); + + // Intra Luma Neighbor Modes + (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode = (EB_U32)( + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + (&cuPtr->predictionUnitArray[0])->intraLumaTopMode = (EB_U32)( + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + // Top Intra Mode Neighbor Array instead of a Full + // Skip Flag Context + cuPtr->skipFlagContext = + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (skipFlagNeighborArray->leftArray[skipFlagLeftNeighborIndex] == EB_TRUE) ? 1 : 0; + cuPtr->skipFlagContext += + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (skipFlagNeighborArray->topArray[skipFlagTopNeighborIndex] == EB_TRUE) ? 1 : 0; + + // Split Flag Context (neighbor info) + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth = leafDepthNeighborArray->leftArray[leafDepthLeftNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth = leafDepthNeighborArray->topArray[leafDepthTopNeighborIndex]; + + return; } void ModeDecisionRefinementContextGeneration( - ModeDecisionContext_t *contextPtr, - CodingUnit_t *cuPtr, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray) + ModeDecisionContext_t *contextPtr, + CodingUnit_t *cuPtr, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - cuOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - cuOriginX); - - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - cuOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - cuOriginX); - - // Intra Luma Neighbor Modes - cuPtr->predictionUnitArray[0].intraLumaLeftMode = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); - cuPtr->predictionUnitArray[0].intraLumaTopMode = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - - // Split Flag Context (neighbor info) - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; - - return; + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + cuOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + cuOriginX); + + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + cuOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + cuOriginX); + + // Intra Luma Neighbor Modes + cuPtr->predictionUnitArray[0].intraLumaLeftMode = (EB_U32)( + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + cuPtr->predictionUnitArray[0].intraLumaTopMode = (EB_U32)( + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + + // Split Flag Context (neighbor info) + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; + + return; } /******************************************** @@ -174,111 +174,111 @@ void ModeDecisionRefinementContextGeneration( ********************************************/ EB_ERRORTYPE TuCalcCost( - EB_U32 cuSize, - ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr - EB_U32 tuIndex, // input parameter, TU index inside the CU - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients - EB_U32 cbCountNonZeroCoeffs, // input parameter, number of non zero cb quantized coefficients - EB_U32 crCountNonZeroCoeffs, // input parameter, number of non zero cr quantized coefficients - EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes - EB_U64 cbTuDistortion[DIST_CALC_TOTAL], // input parameter, Cb distortion for both Normal and Cbf zero modes - EB_U64 crTuDistortion[DIST_CALC_TOTAL], // input parameter, Cr distortion for both Normal and Cbf zero modes - EB_U32 componentMask, - EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate - EB_U64 *cbTuCoeffBits, // input parameter, Cb quantized coefficients rate - EB_U64 *crTuCoeffBits, // input parameter, Cr quantized coefficients rate - EB_U32 qp, // input parameter, Cr quantized coefficients rate - EB_U64 lambda, // input parameter, lambda for Luma - EB_U64 lambdaChroma) // input parameter, lambda for Chroma + EB_U32 cuSize, + ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr + EB_U32 tuIndex, // input parameter, TU index inside the CU + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients + EB_U32 cbCountNonZeroCoeffs, // input parameter, number of non zero cb quantized coefficients + EB_U32 crCountNonZeroCoeffs, // input parameter, number of non zero cr quantized coefficients + EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes + EB_U64 cbTuDistortion[DIST_CALC_TOTAL], // input parameter, Cb distortion for both Normal and Cbf zero modes + EB_U64 crTuDistortion[DIST_CALC_TOTAL], // input parameter, Cr distortion for both Normal and Cbf zero modes + EB_U32 componentMask, + EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate + EB_U64 *cbTuCoeffBits, // input parameter, Cb quantized coefficients rate + EB_U64 *crTuCoeffBits, // input parameter, Cr quantized coefficients rate + EB_U32 qp, // input parameter, Cr quantized coefficients rate + EB_U64 lambda, // input parameter, lambda for Luma + EB_U64 lambdaChroma) // input parameter, lambda for Chroma { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 yCbfCtx = ((cuSize == transformSize)); - // Non Zero Cbf mode variables - EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; + // Non Zero Cbf mode variables + EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; - EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; + EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; - EB_U64 yNonZeroCbfRate; + EB_U64 yNonZeroCbfRate; - EB_U64 yNonZeroCbfCost = 0; + EB_U64 yNonZeroCbfCost = 0; - // Zero Cbf mode variables - EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; + // Zero Cbf mode variables + EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; - EB_U64 yZeroCbfLumaFlagBitsNum = 0; + EB_U64 yZeroCbfLumaFlagBitsNum = 0; - EB_U64 yZeroCbfRate; + EB_U64 yZeroCbfRate; - EB_U64 yZeroCbfCost = 0; + EB_U64 yZeroCbfCost = 0; - // Luma and chroma transform size shift for the distortion - (void)lambdaChroma; - (void)qp; - (void)crTuCoeffBits; - (void)cbTuCoeffBits; - (void)cbTuDistortion; - (void)crTuDistortion; - (void)transformChromaSize; + // Luma and chroma transform size shift for the distortion + (void)lambdaChroma; + (void)qp; + (void)crTuCoeffBits; + (void)cbTuCoeffBits; + (void)cbTuDistortion; + (void)crTuDistortion; + (void)transformChromaSize; - // **Compute distortion + // **Compute distortion - if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { + if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { - // Non Zero Distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); + // Non Zero Distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); - // Zero distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); + // Zero distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); - // **Compute Rate + // **Compute Rate - // Estimate Cbf's Bits + // Estimate Cbf's Bits - yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; + yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; - yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; - yZeroCbfRate = yZeroCbfLumaFlagBitsNum; + yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; + yZeroCbfRate = yZeroCbfLumaFlagBitsNum; - if (candidatePtr->type == INTRA_MODE) { + if (candidatePtr->type == INTRA_MODE) { - yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; + yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; - } - else { + } + else { - yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - } + } - // **Compute Cost - yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + // **Compute Cost + yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); - *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; - yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; - } + candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); + *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; + yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; + } - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - candidatePtr->cbCbf |= ((cbCountNonZeroCoeffs != 0) << tuIndex); - } + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + candidatePtr->cbCbf |= ((cbCountNonZeroCoeffs != 0) << tuIndex); + } - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - candidatePtr->crCbf |= ((crCountNonZeroCoeffs != 0) << tuIndex); - } + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + candidatePtr->crCbf |= ((crCountNonZeroCoeffs != 0) << tuIndex); + } - return return_error; + return return_error; } /******************************************** @@ -287,83 +287,83 @@ EB_ERRORTYPE TuCalcCost( ********************************************/ EB_ERRORTYPE TuCalcCostLuma( - EB_U32 cuSize, - ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr - EB_U32 tuIndex, // input parameter, TU index inside the CU - EB_U32 transformSize, - EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients - EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes - EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate - EB_U32 qp, // input parameter, Cr quantized coefficients rate - EB_U64 lambda, // input parameter, lambda for Luma - EB_U64 lambdaChroma) // input parameter, lambda for Chroma + EB_U32 cuSize, + ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr + EB_U32 tuIndex, // input parameter, TU index inside the CU + EB_U32 transformSize, + EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients + EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes + EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate + EB_U32 qp, // input parameter, Cr quantized coefficients rate + EB_U64 lambda, // input parameter, lambda for Luma + EB_U64 lambdaChroma) // input parameter, lambda for Chroma { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 yCbfCtx = ((cuSize == transformSize)); - // Non Zero Cbf mode variables - EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; + // Non Zero Cbf mode variables + EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; - EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; + EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; - EB_U64 yNonZeroCbfRate; + EB_U64 yNonZeroCbfRate; - EB_U64 yNonZeroCbfCost = 0; + EB_U64 yNonZeroCbfCost = 0; - // Zero Cbf mode variables - EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; + // Zero Cbf mode variables + EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; - EB_U64 yZeroCbfLumaFlagBitsNum = 0; + EB_U64 yZeroCbfLumaFlagBitsNum = 0; - EB_U64 yZeroCbfRate; + EB_U64 yZeroCbfRate; - EB_U64 yZeroCbfCost = 0; + EB_U64 yZeroCbfCost = 0; - // Luma and chroma transform size shift for the distortion + // Luma and chroma transform size shift for the distortion - (void)lambdaChroma; - (void)qp; + (void)lambdaChroma; + (void)qp; - // **Compute distortion - // Non Zero Distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); + // **Compute distortion + // Non Zero Distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); - // Zero distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); + // Zero distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); - // **Compute Rate + // **Compute Rate - // Estimate Cbf's Bits + // Estimate Cbf's Bits - yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; - yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; - yZeroCbfRate = yZeroCbfLumaFlagBitsNum; + yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; + yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; + yZeroCbfRate = yZeroCbfLumaFlagBitsNum; - if (candidatePtr->type == INTRA_MODE){ + if (candidatePtr->type == INTRA_MODE){ - yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; + yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; - } - else{ + } + else{ - yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - } + } - // **Compute Cost - yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + // **Compute Cost + yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); - *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; - yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; + candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); + *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; + yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; - return return_error; + return return_error; } /********************************************************************************* @@ -379,45 +379,45 @@ EB_ERRORTYPE TuCalcCostLuma( * intra mode as the current PU. **********************************************************************************/ EB_ERRORTYPE IntraLumaModeContext( - CodingUnit_t *cuPtr, - EB_U32 lumaMode, - EB_S32 *predictionIndex) + CodingUnit_t *cuPtr, + EB_U32 lumaMode, + EB_S32 *predictionIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaPredictionArray[3]; - EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; - EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; - - if (leftNeighborMode == topNeighborMode) { - if (leftNeighborMode > 1) { // For angular modes - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - lumaPredictionArray[0] = EB_INTRA_PLANAR; - lumaPredictionArray[1] = EB_INTRA_DC; - lumaPredictionArray[2] = EB_INTRA_VERTICAL; - } - } - else { - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } - - *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : - (lumaMode == lumaPredictionArray[1]) ? 1 : - (lumaMode == lumaPredictionArray[2]) ? 2 : - -1; // luma mode is not equal to any of the predictors - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 lumaPredictionArray[3]; + EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; + EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; + + if (leftNeighborMode == topNeighborMode) { + if (leftNeighborMode > 1) { // For angular modes + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + lumaPredictionArray[0] = EB_INTRA_PLANAR; + lumaPredictionArray[1] = EB_INTRA_DC; + lumaPredictionArray[2] = EB_INTRA_VERTICAL; + } + } + else { + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } + + *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : + (lumaMode == lumaPredictionArray[1]) ? 1 : + (lumaMode == lumaPredictionArray[2]) ? 2 : + -1; // luma mode is not equal to any of the predictors + + return return_error; } /********************************************************************************* @@ -439,124 +439,124 @@ EB_ERRORTYPE IntraLumaModeContext( **********************************************************************************/ EB_ERRORTYPE Intra2Nx2NFastCostIsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - EB_U32 lumaMode = candidatePtr->intraLumaMode; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + EB_U32 lumaMode = candidatePtr->intraLumaMode; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate = 0; - EB_U64 chromaRate; - EB_U64 lumaSad, chromaSad; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate = 0; + EB_U64 chromaRate; + EB_U64 lumaSad, chromaSad; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Luma and chroma distortion + EB_U64 totalDistortion; (void) pictureControlSetPtr; - // Estimate Chroma Mode Bits - chromaRate = 9732; // candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Partition Size Bits : + // Estimate Chroma Mode Bits + chromaRate = 9732; // candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Partition Size Bits : lumaRate = contextPtr->cuStats->depth == 3 ? 24752 : ZERO_COST; - // Estimate Luma Mode Bits for Intra - lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 57520 : 206378; - // Keep the Fast Luma and Chroma rate for future use - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = chromaRate; + // Estimate Luma Mode Bits for Intra + lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 57520 : 206378; + // Keep the Fast Luma and Chroma rate for future use + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = chromaRate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // include luma only in total distortion - - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight - totalDistortion = lumaSad + chromaSad; + // include luma only in total distortion - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight + totalDistortion = lumaSad + chromaSad; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - return return_error; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + + return return_error; } EB_ERRORTYPE Intra2Nx2NFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - EB_S32 predictionIndex = -1; - // Number of bits for each synatax element + EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + EB_S32 predictionIndex = -1; + // Number of bits for each synatax element EB_U64 partSizeIntraBitsNum = 0; - EB_U64 intraLumaModeBitsNum = 0; - - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 lumaSad, chromaSad; - - // Luma and chroma distortion - EB_U64 totalDistortion; - // Estimate Chroma Mode Bits - chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[EB_INTRA_CHROMA_DM]; - - // Estimate Partition Size Bits : - partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[SIZE_2Nx2N] : - ZERO_COST; - - // Estimate Luma Mode Bits for Intra - IntraLumaModeContext( - cuPtr, - lumaMode, - &predictionIndex); - - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - partSizeIntraBitsNum + - intraLumaModeBitsNum; - - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; - - candidateBufferPtr->residualLumaSad = lumaDistortion; + EB_U64 intraLumaModeBitsNum = 0; + + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 lumaSad, chromaSad; + + // Luma and chroma distortion + EB_U64 totalDistortion; + // Estimate Chroma Mode Bits + chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[EB_INTRA_CHROMA_DM]; + + // Estimate Partition Size Bits : + partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[SIZE_2Nx2N] : + ZERO_COST; + + // Estimate Luma Mode Bits for Intra + IntraLumaModeContext( + cuPtr, + lumaMode, + &predictionIndex); + + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + partSizeIntraBitsNum + + intraLumaModeBitsNum; + + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; + + candidateBufferPtr->residualLumaSad = lumaDistortion; lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight totalDistortion = lumaSad + chromaSad; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } @@ -579,50 +579,50 @@ EB_ERRORTYPE Intra2Nx2NFastCostIslice( **********************************************************************************/ EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 lumaSad, chromaSad; - EB_U32 lumaMode = candidatePtr->intraLumaMode; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 lumaSad, chromaSad; + EB_U32 lumaMode = candidatePtr->intraLumaMode; + // Luma and chroma distortion + EB_U64 totalDistortion; - // Estimate Chroma Mode Bits - chromaRate = 12368; // mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Partition Size Bits + // Estimate Chroma Mode Bits + chromaRate = 12368; // mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Partition Size Bits lumaRate = contextPtr->cuStats->depth == 3 ? 31523 : ZERO_COST; - // Estimate Pred Mode Bits - lumaRate += 136034; // mdRateEstimationPtr->predModeBits[candidateType]; - //// Estimate Luma Mode Bits for Intra - lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 72731 : 192228; + // Estimate Pred Mode Bits + lumaRate += 136034; // mdRateEstimationPtr->predModeBits[candidateType]; + //// Estimate Luma Mode Bits for Intra + lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 72731 : 192228; - // Keep the Fast Luma and Chroma rate for future use - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = chromaRate; + // Keep the Fast Luma and Chroma rate for future use + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = chromaRate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // include luma only in total distortion - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // include luma only in total distortion + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSad = (((chromaDistortion * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -633,26 +633,26 @@ EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( chromaSad = (((chromaDistortion * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - totalDistortion = lumaSad + chromaSad; + totalDistortion = lumaSad + chromaSad; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } /********************************************************************************* @@ -671,122 +671,122 @@ EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullCostIslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; - // EB_U64 lumaCoeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; + // EB_U64 lumaCoeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - (void)pictureControlSetPtr; - (void)cuPtr; - (void)transformChromaSize; + (void)pictureControlSetPtr; + (void)cuPtr; + (void)transformChromaSize; (void)lcuPtr; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; - crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; + crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight - distortion = lumaSse + chromaSse; + distortion = lumaSse + chromaSse; - // Assign full cost + // Assign full cost *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; coeffRate = (*yCoeffBits) << 15; candidateBufferPtr->fullCostLuma = lumaSse + (((lambda * coeffRate + lambda * lumaRate ) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -805,110 +805,110 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullCostPslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; - //EB_U64 lumaCoeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; + //EB_U64 lumaCoeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - (void)cuPtr; - (void)transformChromaSize; + (void)cuPtr; + (void)transformChromaSize; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; - crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; + crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -918,31 +918,31 @@ EB_ERRORTYPE IntraFullCostPslice( else { chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } - - distortion = lumaSse + chromaSse; - - // Assign full cost + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } + + distortion = lumaSse + chromaSse; + + // Assign full cost *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + (void)lcuPtr; coeffRate = (*yCoeffBits) << 15; candidateBufferPtr->fullCostLuma = lumaSse + (((lambda * coeffRate + lambda * lumaRate ) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -961,85 +961,85 @@ EB_ERRORTYPE IntraFullCostPslice( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullLumaCostIslice( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; + // Luma and chroma SSE + EB_U64 lumaSse; - (void)cuPtr; + (void)cuPtr; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // luma distortion - lumaSse = yDistortion[0]; + // luma distortion + lumaSse = yDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - distortion = lumaSse; + distortion = lumaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - return return_error; + return return_error; } /********************************************************************************* @@ -1058,85 +1058,85 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullLumaCostPslice( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; + // Luma and chroma SSE + EB_U64 lumaSse; - (void)cuPtr; + (void)cuPtr; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // luma distortion - lumaSse = yDistortion[0]; + // luma distortion + lumaSse = yDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - distortion = lumaSse; + distortion = lumaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - return return_error; + return return_error; } /********************************************************************************* @@ -1156,97 +1156,97 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, **********************************************************************************/ EB_ERRORTYPE InterFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + CodingUnit_t *cuPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U64 lumaSad, chromaSad; - EB_U64 lumaRate; - EB_U64 distortion; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U64 lumaSad, chromaSad; + EB_U64 lumaRate; + EB_U64 distortion; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; (void)contextPtr; - if (candidatePtr->mergeFlag == EB_TRUE){ - EB_U32 mergeIndex = candidatePtr->mergeIndex; - // Rate - EB_U64 mergeSkiplumaRate; - mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + if (candidatePtr->mergeFlag == EB_TRUE){ + EB_U32 mergeIndex = candidatePtr->mergeIndex; + // Rate + EB_U64 mergeSkiplumaRate; + mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + + { + mergeSkiplumaRate += mergeIndexBits[mergeIndex]; + } - { - mergeSkiplumaRate += mergeIndexBits[mergeIndex]; - } + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidatePtr->fastLumaRate = mergeSkiplumaRate; + candidatePtr->fastChromaRate = ZERO_COST; + if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ + + chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); + distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; + + } + else{ + distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; + } + candidateBufferPtr->residualLumaSad = lumaDistortion; - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidatePtr->fastLumaRate = mergeSkiplumaRate; - candidatePtr->fastChromaRate = ZERO_COST; - if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); - chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); - distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; + } + else{ - } - else{ - distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; - } - candidateBufferPtr->residualLumaSad = lumaDistortion; - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); + EB_U8 amvpIdx; + EB_S32 predRefX; + EB_S32 predRefY; + EB_S32 mvRefX; + EB_S32 mvRefY; - } - else{ + // Estimate Syntax Bits + lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; - EB_U8 amvpIdx; - EB_S32 predRefX; - EB_S32 predRefY; - EB_S32 mvRefX; - EB_S32 mvRefY; - // Estimate Syntax Bits + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; + mvRefX = candidatePtr->motionVector_x_L0; + mvRefY = candidatePtr->motionVector_y_L0; - lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; - mvRefX = candidatePtr->motionVector_x_L0; - mvRefY = candidatePtr->motionVector_y_L0; + EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); + EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - - EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); - EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; - - - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = ZERO_COST; + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = ZERO_COST; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (6 * PSNRy + PSNRu + PSNRv) / 8. This approximate weighting - // should be used in the cost calc. - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (6 * PSNRy + PSNRu + PSNRv) / 8. This approximate weighting + // should be used in the cost calc. + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSad = (((chromaDistortion * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -1256,29 +1256,29 @@ EB_ERRORTYPE InterFastCostPsliceOpt( else { chromaSad = (((chromaDistortion * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - distortion = lumaSad + chromaSad; + distortion = lumaSad + chromaSad; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // overwrite lumaDistortion with the shifted value to be used in cost function - lumaDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); + // overwrite lumaDistortion with the shifted value to be used in cost function + lumaDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - } - return return_error; + } + return return_error; } /********************************************************************************* @@ -1298,143 +1298,143 @@ EB_ERRORTYPE InterFastCostPsliceOpt( **********************************************************************************/ EB_ERRORTYPE InterFastCostBsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + CodingUnit_t *cuPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + EB_ERRORTYPE return_error = EB_ErrorNone; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; // Luma rate - EB_U64 lumaRate; - EB_U64 distortion; // Luma and chroma distortion - EB_U64 lumaSad, chromaSad; - if (candidatePtr->mergeFlag == EB_TRUE){ - - EB_U32 mergeIndex = candidatePtr->mergeIndex; - // Rate - EB_U64 mergeSkiplumaRate; - mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - - { - mergeSkiplumaRate += mergeIndexBits[mergeIndex]; - } - - - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidatePtr->fastLumaRate = mergeSkiplumaRate; - candidatePtr->fastChromaRate = ZERO_COST; - if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ - - chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); - distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; - - } - else{ - distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; - } - candidateBufferPtr->residualLumaSad = lumaDistortion; - - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); - - } - else{ - - const EB_U32 puIndex = 0; - EB_U8 amvpIdx; - EB_S32 predRefX; - EB_S32 predRefY; - EB_S32 mvRefX; - EB_S32 mvRefY; - EB_PREDDIRECTION predDirection = candidatePtr->predictionDirection[puIndex]; - EB_BOOL biPred = (EB_BOOL)(predDirection == BI_PRED); - - // Estimate Syntax Bits - - lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; + EB_U64 lumaRate; + EB_U64 distortion; // Luma and chroma distortion + EB_U64 lumaSad, chromaSad; + if (candidatePtr->mergeFlag == EB_TRUE){ + + EB_U32 mergeIndex = candidatePtr->mergeIndex; + // Rate + EB_U64 mergeSkiplumaRate; + mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + + { + mergeSkiplumaRate += mergeIndexBits[mergeIndex]; + } + + + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidatePtr->fastLumaRate = mergeSkiplumaRate; + candidatePtr->fastChromaRate = ZERO_COST; + if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ + + chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); + distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; + + } + else{ + distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; + } + candidateBufferPtr->residualLumaSad = lumaDistortion; + + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); + + } + else{ + + const EB_U32 puIndex = 0; + EB_U8 amvpIdx; + EB_S32 predRefX; + EB_S32 predRefY; + EB_S32 mvRefX; + EB_S32 mvRefY; + EB_PREDDIRECTION predDirection = candidatePtr->predictionDirection[puIndex]; + EB_BOOL biPred = (EB_BOOL)(predDirection == BI_PRED); + + // Estimate Syntax Bits + + lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; lumaRate += interBiDirBits[(contextPtr->cuStats->depth << 1) + biPred]; - - if (predDirection < 2 && predDirection != BI_PRED) { - - lumaRate += interUniDirBits[predDirection]; - - if (predDirection == UNI_PRED_LIST_0){ - - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; - mvRefX = candidatePtr->motionVector_x_L0; - mvRefY = candidatePtr->motionVector_y_L0; - - } - else{ - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; - mvRefX = candidatePtr->motionVector_x_L1; - mvRefY = candidatePtr->motionVector_y_L1; - - } - - EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); - EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - - - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; - - } - else{ - - // LIST 0 Rate Estimation - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; - mvRefX = candidatePtr->motionVector_x_L0; - mvRefY = candidatePtr->motionVector_y_L0; - - EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); - EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; - - // LIST 1 Rate Estimation - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; - mvRefX = candidatePtr->motionVector_x_L1; - mvRefY = candidatePtr->motionVector_y_L1; - - mvdX = EB_ABS_DIFF(predRefX, mvRefX); - mvdY = EB_ABS_DIFF(predRefY, mvRefY); - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; - - - } - - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidateBufferPtr->residualLumaSad = lumaDistortion; - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = ZERO_COST; - - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + + if (predDirection < 2 && predDirection != BI_PRED) { + + lumaRate += interUniDirBits[predDirection]; + + if (predDirection == UNI_PRED_LIST_0){ + + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; + mvRefX = candidatePtr->motionVector_x_L0; + mvRefY = candidatePtr->motionVector_y_L0; + + } + else{ + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; + mvRefX = candidatePtr->motionVector_x_L1; + mvRefY = candidatePtr->motionVector_y_L1; + + } + + EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); + EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); + + + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; + + } + else{ + + // LIST 0 Rate Estimation + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; + mvRefX = candidatePtr->motionVector_x_L0; + mvRefY = candidatePtr->motionVector_y_L0; + + EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); + EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; + + // LIST 1 Rate Estimation + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; + mvRefX = candidatePtr->motionVector_x_L1; + mvRefY = candidatePtr->motionVector_y_L1; + + mvdX = EB_ABS_DIFF(predRefX, mvRefX); + mvdY = EB_ABS_DIFF(predRefY, mvRefY); + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; + + + } + + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidateBufferPtr->residualLumaSad = lumaDistortion; + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = ZERO_COST; + + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSad = (((chromaDistortion * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -1444,295 +1444,295 @@ EB_ERRORTYPE InterFastCostBsliceOpt( else { chromaSad = (((chromaDistortion * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - distortion = lumaSad + chromaSad; + distortion = lumaSad + chromaSad; - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - } - return return_error; + } + return return_error; } /************************************ ******* EstimateTuFlags **************************************/ EB_ERRORTYPE EstimateTuFlags( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *tranSubDivFlagBitsNum, - EB_U64 *cbfLumaFlagBitsNum, - EB_U64 *cbfChromaFlagBitsNum) + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *tranSubDivFlagBitsNum, + EB_U64 *cbfLumaFlagBitsNum, + EB_U64 *cbfChromaFlagBitsNum) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 subDivContext; - EB_U32 tuIndex; - EB_U32 tuIndexDepth2; - EB_U32 tuTotalCount; - - - TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStatPtr; - EB_U32 tuItr; - EB_U32 tuSize; - EB_U32 parentTuIndex; - - EB_U32 cbfContext; - - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - - *tranSubDivFlagBitsNum = 0; - *cbfLumaFlagBitsNum = 0; - *cbfChromaFlagBitsNum = 0; - - // Set TU variables - if (cuSize == MAX_LCU_SIZE){ - tuTotalCount = 4; - tuIndex = 1; - tuItr = 0; - tuPtr = &cuPtr->transformUnitArray[0]; - tuPtr->splitFlag = EB_TRUE; - tuPtr->cbCbf = EB_FALSE; - tuPtr->crCbf = EB_FALSE; - tuPtr->chromaCbfContext = 0; //at TU level - } - else { - tuTotalCount = 1; - tuIndex = 0; - tuItr = 0; - } - - // Set TU - do { - tuStatPtr = GetTransformUnitStats(tuIndex); - tuSize = cuSize >> tuStatPtr->depth; - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - parentTuIndex = 0; - if (tuStatPtr->depth > 0) - parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; - - tuPtr->splitFlag = EB_FALSE; - tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); - tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); - tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); - tuPtr->chromaCbfContext = (tuIndex == 0) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level - tuPtr->lumaCbfContext = (cuSizeLog2 - Log2f(tuSize)) == 0 ? 1 : 0; - - if (tuPtr->cbCbf){ - cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; - } - if (tuPtr->crCbf){ - cuPtr->transformUnitArray[0].crCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; - } - - ++tuItr; - tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; - - } while (tuItr < tuTotalCount); - - - tuPtr = &cuPtr->transformUnitArray[0]; - tuStatPtr = GetTransformUnitStats(0); - tuSize = cuSize >> tuStatPtr->depth; - cbfContext = tuPtr->chromaCbfContext; - subDivContext = 5 - Log2f(tuSize); - - if (cuSize != 64) { - // Encode split flag - *tranSubDivFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; - } - - if (tuPtr->splitFlag) { - - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - for (tuIndex = 1; tuIndex < 5; tuIndex += 1) { - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - tuStatPtr = GetTransformUnitStats(tuIndex); - tuSize = cuSize >> tuStatPtr->depth; - - - if (GetCodedUnitStats(cuPtr->leafIndex)->size != 8) { - subDivContext = 5 - Log2f(tuSize); - // Encode split flag - *tranSubDivFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; - } - - if (tuPtr->splitFlag) { - cbfContext = tuPtr->chromaCbfContext; - if ((cuPtr->transformUnitArray[0].cbCbf) != 0){ - // Cb CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - if ((cuPtr->transformUnitArray[0].crCbf) != 0){ - // Cr CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - - } - - // Transform depth 2 - //tuIndexDepth2 = tuIndex*4 + 1; - - tuIndexDepth2 = tuIndex + 1; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 subDivContext; + EB_U32 tuIndex; + EB_U32 tuIndexDepth2; + EB_U32 tuTotalCount; + + + TransformUnit_t *tuPtr; + const TransformUnitStats_t *tuStatPtr; + EB_U32 tuItr; + EB_U32 tuSize; + EB_U32 parentTuIndex; + + EB_U32 cbfContext; + + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + + *tranSubDivFlagBitsNum = 0; + *cbfLumaFlagBitsNum = 0; + *cbfChromaFlagBitsNum = 0; + + // Set TU variables + if (cuSize == MAX_LCU_SIZE){ + tuTotalCount = 4; + tuIndex = 1; + tuItr = 0; + tuPtr = &cuPtr->transformUnitArray[0]; + tuPtr->splitFlag = EB_TRUE; + tuPtr->cbCbf = EB_FALSE; + tuPtr->crCbf = EB_FALSE; + tuPtr->chromaCbfContext = 0; //at TU level + } + else { + tuTotalCount = 1; + tuIndex = 0; + tuItr = 0; + } + + // Set TU + do { + tuStatPtr = GetTransformUnitStats(tuIndex); + tuSize = cuSize >> tuStatPtr->depth; + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + parentTuIndex = 0; + if (tuStatPtr->depth > 0) + parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; + + tuPtr->splitFlag = EB_FALSE; + tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); + tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); + tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); + tuPtr->chromaCbfContext = (tuIndex == 0) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level + tuPtr->lumaCbfContext = (cuSizeLog2 - Log2f(tuSize)) == 0 ? 1 : 0; + + if (tuPtr->cbCbf){ + cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; + } + if (tuPtr->crCbf){ + cuPtr->transformUnitArray[0].crCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; + } + + ++tuItr; + tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + + } while (tuItr < tuTotalCount); + + + tuPtr = &cuPtr->transformUnitArray[0]; + tuStatPtr = GetTransformUnitStats(0); + tuSize = cuSize >> tuStatPtr->depth; + cbfContext = tuPtr->chromaCbfContext; + subDivContext = 5 - Log2f(tuSize); + + if (cuSize != 64) { + // Encode split flag + *tranSubDivFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; + } + + if (tuPtr->splitFlag) { + + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + for (tuIndex = 1; tuIndex < 5; tuIndex += 1) { + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + tuStatPtr = GetTransformUnitStats(tuIndex); + tuSize = cuSize >> tuStatPtr->depth; + + + if (GetCodedUnitStats(cuPtr->leafIndex)->size != 8) { + subDivContext = 5 - Log2f(tuSize); + // Encode split flag + *tranSubDivFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; + } + + if (tuPtr->splitFlag) { + cbfContext = tuPtr->chromaCbfContext; + if ((cuPtr->transformUnitArray[0].cbCbf) != 0){ + // Cb CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + if ((cuPtr->transformUnitArray[0].crCbf) != 0){ + // Cr CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + + } + + // Transform depth 2 + //tuIndexDepth2 = tuIndex*4 + 1; + + tuIndexDepth2 = tuIndex + 1; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - - tuIndexDepth2++; + cbfContext = tuPtr->chromaCbfContext; + + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + cbfContext = tuPtr->lumaCbfContext; + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + + tuIndexDepth2++; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - cbfContext = tuPtr->lumaCbfContext; - - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - - tuIndexDepth2++; + cbfContext = tuPtr->chromaCbfContext; + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + cbfContext = tuPtr->lumaCbfContext; + + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + + tuIndexDepth2++; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; + cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - cbfContext = tuPtr->lumaCbfContext; + cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - tuIndexDepth2++; + tuIndexDepth2++; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; + cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - cbfContext = tuPtr->lumaCbfContext; + cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - else { + } + else { - cbfContext = tuPtr->chromaCbfContext; + cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[0].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cb CBF + if ((cuPtr->transformUnitArray[0].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - // Cr CBF - if ((cuPtr->transformUnitArray[0].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cr CBF + if ((cuPtr->transformUnitArray[0].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - cbfContext = tuPtr->lumaCbfContext; + cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - } + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + } - } - else { + } + else { - // Cb CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Cb CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - // Cr CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Cr CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - // Luma CBF + // Luma CBF - // In the Inter case, if the RootCbf is 1 and the Chroma Cbfs are 0, then we can infer that the - // luma Cbf is true, so there is no need to code it. - if (tuPtr->cbCbf || tuPtr->crCbf) { + // In the Inter case, if the RootCbf is 1 and the Chroma Cbfs are 0, then we can infer that the + // luma Cbf is true, so there is no need to code it. + if (tuPtr->cbCbf || tuPtr->crCbf) { - //cbfContext = ((cuPtr->size == tuPtr->size) || (tuPtr->size == TRANSFORM_MAX_SIZE)); - cbfContext = tuPtr->lumaCbfContext; + //cbfContext = ((cuPtr->size == tuPtr->size) || (tuPtr->size == TRANSFORM_MAX_SIZE)); + cbfContext = tuPtr->lumaCbfContext; - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[(tuPtr->lumaCbf>0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - } + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[(tuPtr->lumaCbf>0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + } - return return_error; + return return_error; } /********************************************************************************* @@ -1751,174 +1751,174 @@ EB_ERRORTYPE EstimateTuFlags( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE InterFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ - MergeSkipFullCost( - lcuPtr, - cuPtr, - cuSize, - cuSizeLog2, - candidateBufferPtr, - qp, - yDistortion, - cbDistortion, - crDistortion, - lambda, - lambdaChroma, - yCoeffBits, - cbCoeffBits, - crCoeffBits, - transformSize, - transformChromaSize, - pictureControlSetPtr); - - } - else{ - - // Full Rate Estimation - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - - - EB_U64 rootCbfBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; - - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; - - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; - - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx; - - - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; - EB_U32 tuIndex; - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - transSubDivFlagCtx = 5 - Log2f(transformSize); - - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; - //EB_U64 lumaCoeffRate; - - // Luma and chroma distortion - EB_U64 distortion; - - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; - - // Rate Estimation of each syntax element - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; - - (void)cuPtr; - (void)cuSize; - (void)transformChromaSize; - - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - - chromaCbfCtx = 0; - //yCbfCtx = cuSizeLog2 - Log2f(transformSize); - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - - cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; - crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - tuIndex += 1; - - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits - - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + EB_ERRORTYPE return_error = EB_ErrorNone; + + if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ + MergeSkipFullCost( + lcuPtr, + cuPtr, + cuSize, + cuSizeLog2, + candidateBufferPtr, + qp, + yDistortion, + cbDistortion, + crDistortion, + lambda, + lambdaChroma, + yCoeffBits, + cbCoeffBits, + crCoeffBits, + transformSize, + transformChromaSize, + pictureControlSetPtr); + + } + else{ + + // Full Rate Estimation + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + + + EB_U64 rootCbfBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; + + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; + + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; + + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx; + - cbCbfBlock = (cbCbf > 0); - crCbfBlock = (crCbf > 0); - yCbfBlock = (yCbf > 0); + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - if (cbCbf || crCbf) { - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; + EB_U32 tuIndex; + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; + //EB_U64 lumaCoeffRate; + + // Luma and chroma distortion + EB_U64 distortion; + + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; + + // Rate Estimation of each syntax element + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; + + (void)cuPtr; + (void)cuSize; + (void)transformChromaSize; + + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + + chromaCbfCtx = 0; + //yCbfCtx = cuSizeLog2 - Log2f(transformSize); + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + + cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; + crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfCtx = 0; + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + tuIndex += 1; + + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits + + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + + cbCbfBlock = (cbCbf > 0); + crCbfBlock = (crCbf > 0); + yCbfBlock = (yCbf > 0); + + if (cbCbf || crCbf) { + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } + + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - // Compute Cost - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + // Compute Cost + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -1928,26 +1928,26 @@ EB_ERRORTYPE InterFullCost( else { chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } - - distortion = lumaSse + chromaSse; - - // Assign full cost + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } + + distortion = lumaSse + chromaSse; + + // Assign full cost *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - } - return return_error; + } + return return_error; } /********************************************************************************* @@ -1966,120 +1966,120 @@ EB_ERRORTYPE InterFullCost( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE InterFullLumaCost( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; - if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ - MergeSkipFullLumaCost( - cuPtr, - cuSize, - cuSizeLog2, - candidateBufferPtr, - yDistortion, - lambda, - yCoeffBits, - transformSize); + EB_ERRORTYPE return_error = EB_ErrorNone; + if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ + MergeSkipFullLumaCost( + cuPtr, + cuSize, + cuSizeLog2, + candidateBufferPtr, + yDistortion, + lambda, + yCoeffBits, + transformSize); - } - else{ + } + else{ - // Full Rate Estimation - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + // Full Rate Estimation + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - EB_U64 rootCbfBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 rootCbfBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; - EB_U32 tuIndex; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; + EB_U32 tuIndex; - transSubDivFlagCtx = 5 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; + // Luma and chroma SSE + EB_U64 lumaSse; - // Rate Estimation of each syntax element - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; + // Rate Estimation of each syntax element + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; - (void)cuPtr; - (void)cuSize; + (void)cuPtr; + (void)cuSize; - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - tuIndex += 1 ; - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits + yCbfCtx = 0; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + tuIndex += 1 ; + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = (yCbf > 0); + yCbfBlock = (yCbf > 0); - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // Compute Cost - lumaSse = yDistortion[0]; + // Compute Cost + lumaSse = yDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - distortion = lumaSse; + distortion = lumaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - } - return return_error; + } + return return_error; } /********************************************************************************* @@ -2098,182 +2098,182 @@ EB_ERRORTYPE InterFullLumaCost( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE MergeSkipFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra - EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; - //EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex[0]; - EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - - EB_U64 skipFlagBitsNum = 0; - EB_U64 mergeFlagBitsNum = 0; - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 predModeBitsNum = 0; - EB_U64 mergeIndexBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; - - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; - - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx; - - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - transSubDivFlagCtx = 5 - Log2f(transformSize); - EB_U32 tuCount; - EB_U32 tuIndex; - - // Merge - EB_U64 mergeLumaRate; - EB_U64 mergeChromaRate; - EB_U64 mergeDistortion; - EB_U64 mergeCost; - //EB_U64 mergeLumaCost; - EB_U64 mergeLumaSse; - EB_U64 mergeChromaSse; - EB_U64 coeffRate; - //EB_U64 lumaCoeffRate; - - // SKIP - EB_U64 skipDistortion; - EB_U64 skipCost; - //EB_U64 skipLumaCost; - - // Luma and chroma transform size shift for the distortion - EB_U64 skipLumaSse; - EB_U64 skipChromaSse; - - (void)transformSize; - (void)transformChromaSize; - (void)cuSize; + EB_ERRORTYPE return_error = EB_ErrorNone; + + + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra + EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; + //EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex[0]; + EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + + EB_U64 skipFlagBitsNum = 0; + EB_U64 mergeFlagBitsNum = 0; + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 predModeBitsNum = 0; + EB_U64 mergeIndexBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; + + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; + + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx; + + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); + EB_U32 tuCount; + EB_U32 tuIndex; + + // Merge + EB_U64 mergeLumaRate; + EB_U64 mergeChromaRate; + EB_U64 mergeDistortion; + EB_U64 mergeCost; + //EB_U64 mergeLumaCost; + EB_U64 mergeLumaSse; + EB_U64 mergeChromaSse; + EB_U64 coeffRate; + //EB_U64 lumaCoeffRate; + + // SKIP + EB_U64 skipDistortion; + EB_U64 skipCost; + //EB_U64 skipLumaCost; + + // Luma and chroma transform size shift for the distortion + EB_U64 skipLumaSse; + EB_U64 skipChromaSse; + + (void)transformSize; + (void)transformChromaSize; + (void)cuSize; (void)lcuPtr; - // Rate Estimation of each syntax element + // Rate Estimation of each syntax element - // Estimate Skip Flag Bits - skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + // Estimate Skip Flag Bits + skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - // Estimate Merge Flag Bits - mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; + // Estimate Merge Flag Bits + mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; - // Estimate Pred Mode Bits - predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; + // Estimate Pred Mode Bits + predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; - { - mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; - } + { + mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; + } //mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - // for Merge, rootCBF is not sent + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + // for Merge, rootCBF is not sent + + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + chromaCbfCtx = 0; + //yCbfCtx = (cuSizeLog2) - Log2f(transformSize);/*((cuPtr->sizeLog2) - Log2f(transformSize)) == 0 ? 1 : 0*/; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - chromaCbfCtx = 0; - //yCbfCtx = (cuSizeLog2) - Log2f(transformSize);/*((cuPtr->sizeLog2) - Log2f(transformSize)) == 0 ? 1 : 0*/; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; + crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfCtx = 0; + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; - crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + tuIndex += 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - tuIndex += 1; - - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = (cbCbf > 0); - crCbfBlock = (crCbf > 0); - yCbfBlock = (yCbf > 0); + cbCbfBlock = (cbCbf > 0); + crCbfBlock = (crCbf > 0); + yCbfBlock = (yCbf > 0); - if (cbCbfBlock || crCbfBlock) { - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + if (cbCbfBlock || crCbfBlock) { + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - mergeChromaRate = cbfChromaFlagBitsNum; + mergeChromaRate = cbfChromaFlagBitsNum; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - // Compute Merge Cost - mergeLumaSse = yDistortion[0]; - mergeChromaSse = cbDistortion[0] + crDistortion[0]; + // Compute Merge Cost + mergeLumaSse = yDistortion[0]; + mergeChromaSse = cbDistortion[0] + crDistortion[0]; - skipLumaSse = yDistortion[1]; - skipChromaSse = cbDistortion[1] + crDistortion[1]; + skipLumaSse = yDistortion[1]; + skipChromaSse = cbDistortion[1] + crDistortion[1]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -2283,30 +2283,30 @@ EB_ERRORTYPE MergeSkipFullCost( else { mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } - - mergeDistortion = mergeLumaSse + mergeChromaSse; + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } + + mergeDistortion = mergeLumaSse + mergeChromaSse; mergeCost = mergeDistortion + (((lambda * coeffRate + lambda * mergeLumaRate + lambdaChroma * mergeChromaRate) + MD_OFFSET) >> MD_SHIFT); - // mergeLumaCost = mergeLumaSse + (((lambda * lumaCoeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); + // mergeLumaCost = mergeLumaSse + (((lambda * lumaCoeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { if (pictureControlSetPtr->temporalLayerIndex == 0) { skipChromaSse = (((skipChromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); @@ -2318,37 +2318,37 @@ EB_ERRORTYPE MergeSkipFullCost( skipChromaSse = (((skipChromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low Delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - skipChromaSse = (((skipChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - skipChromaSse = (((skipChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low Delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + skipChromaSse = (((skipChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + skipChromaSse = (((skipChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - skipDistortion = skipLumaSse + skipChromaSse; + skipDistortion = skipLumaSse + skipChromaSse; skipCost = skipDistortion + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); - //skipLumaCost = skipLumaSse + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); + //skipLumaCost = skipLumaSse + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); - // Assign full cost - *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; + // Assign full cost + *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; - EB_U64 tempDistortion; - tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; + EB_U64 tempDistortion; + tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; *candidateBufferPtr->fullCostMergePtr = mergeCost; *candidateBufferPtr->fullCostSkipPtr = skipCost; // Assign merge flag - candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; - // Assign skip flag - candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; + candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; + // Assign skip flag + candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; - return return_error; + return return_error; } /********************************************************************************* @@ -2367,157 +2367,157 @@ EB_ERRORTYPE MergeSkipFullCost( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE MergeSkipFullLumaCost( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra - EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; - EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra + EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; + EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - EB_U64 skipFlagBitsNum = 0; - EB_U64 mergeFlagBitsNum = 0; - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 predModeBitsNum = 0; - EB_U64 mergeIndexBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; + EB_U64 skipFlagBitsNum = 0; + EB_U64 mergeFlagBitsNum = 0; + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 predModeBitsNum = 0; + EB_U64 mergeIndexBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; - EB_U32 tuIndex; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; + EB_U32 tuIndex; - transSubDivFlagCtx = 5 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); - // Merge - EB_U64 mergeLumaRate; - EB_U64 mergeDistortion; - EB_U64 mergeCost; - EB_U64 mergeLumaSse; - EB_U64 coeffRate; + // Merge + EB_U64 mergeLumaRate; + EB_U64 mergeDistortion; + EB_U64 mergeCost; + EB_U64 mergeLumaSse; + EB_U64 coeffRate; - // SKIP - EB_U64 skipDistortion; - EB_U64 skipCost; + // SKIP + EB_U64 skipDistortion; + EB_U64 skipCost; - // Luma and chroma transform size shift for the distortion - EB_U64 skipLumaSse; + // Luma and chroma transform size shift for the distortion + EB_U64 skipLumaSse; - (void)cuSize; - (void)transformSize; + (void)cuSize; + (void)transformSize; - // Rate Estimation of each syntax element + // Rate Estimation of each syntax element - // Estimate Skip Flag Bits - skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + // Estimate Skip Flag Bits + skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - // Estimate Merge Flag Bits - mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; + // Estimate Merge Flag Bits + mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; - // Estimate Pred Mode Bits - predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; + // Estimate Pred Mode Bits + predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; - // Merge Index + // Merge Index { mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; } - //mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; + //mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - // for Merge, rootCBF is not sent + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + // for Merge, rootCBF is not sent - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfCtx = 0; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - tuIndex += 1; - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + tuIndex += 1; + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = (yCbf > 0); + yCbfBlock = (yCbf > 0); - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // Compute Merge Cost - mergeLumaSse = yDistortion[0]; + // Compute Merge Cost + mergeLumaSse = yDistortion[0]; - skipLumaSse = yDistortion[1]; + skipLumaSse = yDistortion[1]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); - mergeDistortion = mergeLumaSse; + mergeDistortion = mergeLumaSse; - mergeCost = mergeDistortion + (((lambda * coeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); + mergeCost = mergeDistortion + (((lambda * coeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); - skipDistortion = skipLumaSse; + skipDistortion = skipLumaSse; - skipCost = skipDistortion + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); + skipCost = skipDistortion + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); - // Assign full cost - *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; + // Assign full cost + *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; - EB_U64 tempDistortion; - tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; + EB_U64 tempDistortion; + tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; - *candidateBufferPtr->fullCostMergePtr = mergeCost; - *candidateBufferPtr->fullCostSkipPtr = skipCost; + *candidateBufferPtr->fullCostMergePtr = mergeCost; + *candidateBufferPtr->fullCostSkipPtr = skipCost; - // Assign merge flag - candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; - // Assign skip flag - candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; + // Assign merge flag + candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; + // Assign skip flag + candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; - return return_error; + return return_error; } /********************************************************************************* @@ -2535,38 +2535,38 @@ EB_ERRORTYPE MergeSkipFullLumaCost( * mdRateEstimationPtr is pointer to MD rate Estimation Tables **********************************************************************************/ EB_ERRORTYPE SplitFlagRate( - ModeDecisionContext_t *contextPtr, - CodingUnit_t *cuPtr, - EB_U32 splitFlag, - EB_U64 *splitRate, - EB_U64 lambda, - MdRateEstimationContext_t *mdRateEstimationPtr, - EB_U32 tbMaxDepth) + ModeDecisionContext_t *contextPtr, + CodingUnit_t *cuPtr, + EB_U32 splitFlag, + EB_U64 *splitRate, + EB_U64 lambda, + MdRateEstimationContext_t *mdRateEstimationPtr, + EB_U32 tbMaxDepth) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 splitFlagContext; - EB_U32 cuDepth = GetCodedUnitStats(cuPtr->leafIndex)->depth; + EB_U32 splitFlagContext; + EB_U32 cuDepth = GetCodedUnitStats(cuPtr->leafIndex)->depth; - // Calculate the context - splitFlagContext = - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode > INTRA_MODE) ? 0 : - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth > cuDepth) ? 1 : 0; - splitFlagContext += - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode > INTRA_MODE) ? 0 : - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth > cuDepth) ? 1 : 0; + // Calculate the context + splitFlagContext = + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode > INTRA_MODE) ? 0 : + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth > cuDepth) ? 1 : 0; + splitFlagContext += + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode > INTRA_MODE) ? 0 : + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth > cuDepth) ? 1 : 0; - cuPtr->splitFlagContext = splitFlagContext; + cuPtr->splitFlagContext = splitFlagContext; - // Estimate Split Flag Bits - *splitRate = (GetCodedUnitStats(cuPtr->leafIndex)->depth < (tbMaxDepth - 1)) ? - mdRateEstimationPtr->splitFlagBits[splitFlag * (NUMBER_OF_SPLIT_FLAG_CASES >> 1) + splitFlagContext] : - ZERO_COST; + // Estimate Split Flag Bits + *splitRate = (GetCodedUnitStats(cuPtr->leafIndex)->depth < (tbMaxDepth - 1)) ? + mdRateEstimationPtr->splitFlagBits[splitFlag * (NUMBER_OF_SPLIT_FLAG_CASES >> 1) + splitFlagContext] : + ZERO_COST; - // Assign rate - *splitRate = (((lambda * *splitRate) + MD_OFFSET) >> MD_SHIFT); + // Assign rate + *splitRate = (((lambda * *splitRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /******************************************** @@ -2577,122 +2577,122 @@ EB_ERRORTYPE SplitFlagRate( EB_ERRORTYPE EncodeTuCalcCost( EncDecContext_t *contextPtr, - EB_U32 *countNonZeroCoeffs, - EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 *yTuCoeffBits, - EB_U32 componentMask - ) + EB_U32 *countNonZeroCoeffs, + EB_U64 yTuDistortion[DIST_CALC_TOTAL], + EB_U64 *yTuCoeffBits, + EB_U32 componentMask + ) { CodingUnit_t *cuPtr = contextPtr->cuPtr; - EB_U32 cuSize = contextPtr->cuStats->size; + EB_U32 cuSize = contextPtr->cuStats->size; EB_U32 tuIndex = cuSize == 64 ? contextPtr ->tuItr : 0; - EB_U32 transformSize = cuSize == 64 ? 32 : cuSize; + EB_U32 transformSize = cuSize == 64 ? 32 : cuSize; MdRateEstimationContext_t *mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; EB_U64 lambda = contextPtr->fullLambda; EB_U32 yCountNonZeroCoeffs = countNonZeroCoeffs[0]; EB_U32 cbCountNonZeroCoeffs = countNonZeroCoeffs[1]; EB_U32 crCountNonZeroCoeffs = countNonZeroCoeffs[2]; - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 yCbfCtx = ((cuSize == transformSize)); + // Non Zero Cbf mode variables + EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; - // Non Zero Cbf mode variables - EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; + EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; - EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; + EB_U64 yNonZeroCbfRate; - EB_U64 yNonZeroCbfRate; + EB_U64 yNonZeroCbfCost = 0; - EB_U64 yNonZeroCbfCost = 0; + // Zero Cbf mode variables + EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; - // Zero Cbf mode variables - EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; + EB_U64 yZeroCbfLumaFlagBitsNum = 0; - EB_U64 yZeroCbfLumaFlagBitsNum = 0; + EB_U64 yZeroCbfRate; - EB_U64 yZeroCbfRate; + EB_U64 yZeroCbfCost = 0; - EB_U64 yZeroCbfCost = 0; + // Luma and chroma transform size shift for the distortion - // Luma and chroma transform size shift for the distortion - - // **Compute distortion - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + // **Compute distortion + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { // Non Zero Distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); - // Zero distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); + // Zero distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); - yNonZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - yZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; - yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; - yZeroCbfRate = yZeroCbfLumaFlagBitsNum; + yNonZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; + yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; + yZeroCbfRate = yZeroCbfLumaFlagBitsNum; - if ( cuPtr->predictionModeFlag == INTRA_MODE) { + if ( cuPtr->predictionModeFlag == INTRA_MODE) { - yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; + yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; - } - else { + } + else { - yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - } + yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + } - // **Compute Cost - yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + // **Compute Cost + yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - cuPtr->transformUnitArray[tuIndex].lumaCbf = ((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) ? EB_TRUE : EB_FALSE; - *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; - yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; + cuPtr->transformUnitArray[tuIndex].lumaCbf = ((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) ? EB_TRUE : EB_FALSE; + *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; + yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; - } - else{ + } + else{ - cuPtr->transformUnitArray[tuIndex].lumaCbf = EB_FALSE; + cuPtr->transformUnitArray[tuIndex].lumaCbf = EB_FALSE; - } - cuPtr->transformUnitArray[tuIndex].cbCbf = cbCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; - cuPtr->transformUnitArray[tuIndex].crCbf = crCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; + } + cuPtr->transformUnitArray[tuIndex].cbCbf = cbCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; + cuPtr->transformUnitArray[tuIndex].crCbf = crCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; - if (cuPtr->transformUnitArray[tuIndex].lumaCbf) { - cuPtr->transformUnitArray[0].lumaCbf = EB_TRUE; - } + if (cuPtr->transformUnitArray[tuIndex].lumaCbf) { + cuPtr->transformUnitArray[0].lumaCbf = EB_TRUE; + } - if (cuPtr->transformUnitArray[tuIndex].cbCbf) { - cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; - } + if (cuPtr->transformUnitArray[tuIndex].cbCbf) { + cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; + } - if (cuPtr->transformUnitArray[tuIndex].crCbf) { - cuPtr->transformUnitArray[0].crCbf = EB_TRUE; - } + if (cuPtr->transformUnitArray[tuIndex].crCbf) { + cuPtr->transformUnitArray[0].crCbf = EB_TRUE; + } - return return_error; + return return_error; } EB_U64 GetPMCost( - EB_U64 lambda, - EB_U64 tuDistortion, - EB_U64 yTuCoeffBits - ) + EB_U64 lambda, + EB_U64 tuDistortion, + EB_U64 yTuCoeffBits + ) { - - EB_U64 yNonZeroCbfDistortion = LUMA_WEIGHT * (tuDistortion << COST_PRECISION); + + EB_U64 yNonZeroCbfDistortion = LUMA_WEIGHT * (tuDistortion << COST_PRECISION); EB_U64 yNonZeroCbfRate = (yTuCoeffBits ); - EB_U64 yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + EB_U64 yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - return yNonZeroCbfCost; + return yNonZeroCbfCost; } @@ -2709,46 +2709,46 @@ EB_U64 GetPMCost( * intra mode as the current PU. **********************************************************************************/ EB_ERRORTYPE Intra4x4LumaModeContext( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, - EB_U32 lumaMode, - EB_S32 *predictionIndex) + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, + EB_U32 lumaMode, + EB_S32 *predictionIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaPredictionArray[3]; - EB_U32 leftNeighborMode = contextPtr->intraLumaLeftModeArray[puIndex]; - EB_U32 topNeighborMode = contextPtr->intraLumaTopModeArray[puIndex]; - - if (leftNeighborMode == topNeighborMode) { - if (leftNeighborMode > 1) { // For angular modes - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - lumaPredictionArray[0] = EB_INTRA_PLANAR; - lumaPredictionArray[1] = EB_INTRA_DC; - lumaPredictionArray[2] = EB_INTRA_VERTICAL; - } - } - else { - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } - - *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : - (lumaMode == lumaPredictionArray[1]) ? 1 : - (lumaMode == lumaPredictionArray[2]) ? 2 : - -1; // luma mode is not equal to any of the predictors - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 lumaPredictionArray[3]; + EB_U32 leftNeighborMode = contextPtr->intraLumaLeftModeArray[puIndex]; + EB_U32 topNeighborMode = contextPtr->intraLumaTopModeArray[puIndex]; + + if (leftNeighborMode == topNeighborMode) { + if (leftNeighborMode > 1) { // For angular modes + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + lumaPredictionArray[0] = EB_INTRA_PLANAR; + lumaPredictionArray[1] = EB_INTRA_DC; + lumaPredictionArray[2] = EB_INTRA_VERTICAL; + } + } + else { + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } + + *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : + (lumaMode == lumaPredictionArray[1]) ? 1 : + (lumaMode == lumaPredictionArray[2]) ? 2 : + -1; // luma mode is not equal to any of the predictors + + return return_error; } /********************************************************************************* * Intra4x4FastCostIslice function is used to estimate the cost of an intra 4x4 candidate mode @@ -2767,71 +2767,71 @@ EB_ERRORTYPE Intra4x4LumaModeContext( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE Intra4x4FastCostIslice( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 lumaDistortion, - EB_U64 lambda) + EB_U64 lumaDistortion, + EB_U64 lambda) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode; - EB_S32 predictionIndex; + EB_U32 lumaMode; + EB_S32 predictionIndex; - // Number of bits for each synatax element - EB_U64 partSizeIntraBitsNum; - EB_U64 intraLumaModeBitsNum; - // Luma and chroma rate - EB_U64 rate; + // Number of bits for each synatax element + EB_U64 partSizeIntraBitsNum; + EB_U64 intraLumaModeBitsNum; + // Luma and chroma rate + EB_U64 rate; EB_U64 lumaRate; - // Luma distortion - EB_U64 totalDistortion; + // Luma distortion + EB_U64 totalDistortion; - lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - predictionIndex = -1; + lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + predictionIndex = -1; - partSizeIntraBitsNum = 0; - intraLumaModeBitsNum = 0; + partSizeIntraBitsNum = 0; + intraLumaModeBitsNum = 0; - // Estimate Partition Size Bits - partSizeIntraBitsNum = (puIndex == 0) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : - 0; + // Estimate Partition Size Bits + partSizeIntraBitsNum = (puIndex == 0) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : + 0; - // Estimate Luma Mode Bits for Intra - Intra4x4LumaModeContext( + // Estimate Luma Mode Bits for Intra + Intra4x4LumaModeContext( contextPtr, - puIndex, - lumaMode, - &predictionIndex); + puIndex, + lumaMode, + &predictionIndex); - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - // Distortion calculation - totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); + // Distortion calculation + totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); - // Rate calculation - rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Rate calculation + rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - return return_error; + return return_error; } /********************************************************************************* @@ -2851,84 +2851,84 @@ EB_ERRORTYPE Intra4x4FastCostIslice( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE Intra4x4FastCostPslice( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 lumaDistortion, - EB_U64 lambda) + EB_U64 lumaDistortion, + EB_U64 lambda) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode; - EB_S32 predictionIndex; + EB_U32 lumaMode; + EB_S32 predictionIndex; - // Number of bits for each synatax element - EB_U64 predModeBitsNum; - EB_U64 partSizeIntraBitsNum; - EB_U64 intraLumaModeBitsNum; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - // Luma distortion - EB_U64 totalDistortion; + // Number of bits for each synatax element + EB_U64 predModeBitsNum; + EB_U64 partSizeIntraBitsNum; + EB_U64 intraLumaModeBitsNum; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + // Luma distortion + EB_U64 totalDistortion; - lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - predictionIndex = -1; + lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + predictionIndex = -1; - predModeBitsNum = 0; - partSizeIntraBitsNum = 0; - intraLumaModeBitsNum = 0; + predModeBitsNum = 0; + partSizeIntraBitsNum = 0; + intraLumaModeBitsNum = 0; - // Estimate Partition Size Bits - partSizeIntraBitsNum = (puIndex == 0) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : - 0; + // Estimate Partition Size Bits + partSizeIntraBitsNum = (puIndex == 0) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : + 0; - // Estimate Pred Mode Bits + // Estimate Pred Mode Bits - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra - predModeBitsNum = (puIndex == 0) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[1] : - 0; + predModeBitsNum = (puIndex == 0) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[1] : + 0; - // Estimate Luma Mode Bits for Intra - Intra4x4LumaModeContext( + // Estimate Luma Mode Bits for Intra + Intra4x4LumaModeContext( contextPtr, - puIndex, - lumaMode, - &predictionIndex); + puIndex, + lumaMode, + &predictionIndex); - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - predModeBitsNum + - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + predModeBitsNum + + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - // Distortion calculation - totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); + // Distortion calculation + totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); - // Rate calculation - rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Rate calculation + rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - return return_error; + return return_error; } /********************************************************************************* @@ -2950,51 +2950,51 @@ EB_ERRORTYPE Intra4x4FastCostPslice( **********************************************************************************/ EB_ERRORTYPE Intra4x4FullCostIslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; + EB_U32 yCbf; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; - EB_U64 lumaRate; - EB_U64 coeffRate; - EB_U64 distortion; + EB_U64 lumaRate; + EB_U64 coeffRate; + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - (void)transformSize; - yCbf = candidateBufferPtr->candidatePtr->yCbf; + // Luma and chroma SSE + EB_U64 lumaSse; + (void)transformSize; + yCbf = candidateBufferPtr->candidatePtr->yCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits + // Estimate the Transform Split Flag & the Cbf's Bits - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; + lumaSse = yDistortion[0]; - distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -3016,52 +3016,52 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, **********************************************************************************/ EB_ERRORTYPE Intra4x4FullCostPslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; + EB_U32 yCbf; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - EB_U64 distortion; - EB_U64 lumaSse; - (void)transformSize; + EB_U64 distortion; + EB_U64 lumaSse; + (void)transformSize; - yCbf = candidateBufferPtr->candidatePtr->yCbf; + yCbf = candidateBufferPtr->candidatePtr->yCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits + // Estimate the Transform Split Flag & the Cbf's Bits - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; + lumaSse = yDistortion[0]; - distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -3082,355 +3082,355 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraNxNFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - EB_U32 chromaMode = EB_INTRA_CHROMA_DM; - EB_S32 predictionIndex = -1; - EB_U8 partitionMode = 1; // NXN partition + EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + EB_U32 chromaMode = EB_INTRA_CHROMA_DM; + EB_S32 predictionIndex = -1; + EB_U8 partitionMode = 1; // NXN partition - (void)qp; + (void)qp; - // Number of bits for each synatax element - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 intraLumaModeBitsNum = 0; + // Number of bits for each synatax element + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 intraLumaModeBitsNum = 0; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - //EB_U64 lumaSad, chromaSad; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + //EB_U64 lumaSad, chromaSad; + + // Luma and chroma distortion + EB_U64 totalDistortion; - // Luma and chroma distortion - EB_U64 totalDistortion; + //EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - //EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + // Estimate Chroma Mode Bits + chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Chroma Mode Bits - chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : + ZERO_COST; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : - ZERO_COST; + // Estimate Luma Mode Bits for Intra + IntraLumaModeContext( + cuPtr, + lumaMode, + &predictionIndex); - // Estimate Luma Mode Bits for Intra - IntraLumaModeContext( - cuPtr, - lumaMode, - &predictionIndex); + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; + candidateBufferPtr->residualLumaSad = lumaDistortion; - candidateBufferPtr->residualLumaSad = lumaDistortion; + totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; - totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; - - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } EB_ERRORTYPE IntraNxNFastCostPslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - MdRateEstimationContext_t *mdRateEstimationPtr = candidatePtr->mdRateEstimationPtr; - - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra - EB_MODETYPE candidateType = candidatePtr->type == INTER_MODE ? 0 : 1; - EB_U32 lumaMode = candidatePtr->intraLumaMode; - EB_U32 chromaMode = EB_INTRA_CHROMA_DM; - EB_S32 predictionIndex = -1; - EB_U8 partitionMode = 1; // NXN partition + EB_ERRORTYPE return_error = EB_ErrorNone; + + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + MdRateEstimationContext_t *mdRateEstimationPtr = candidatePtr->mdRateEstimationPtr; + + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra + EB_MODETYPE candidateType = candidatePtr->type == INTER_MODE ? 0 : 1; + EB_U32 lumaMode = candidatePtr->intraLumaMode; + EB_U32 chromaMode = EB_INTRA_CHROMA_DM; + EB_S32 predictionIndex = -1; + EB_U8 partitionMode = 1; // NXN partition + + // Number of bits for each synatax element + EB_U64 predModeBitsNum = 0; + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 intraLumaModeBitsNum = 0; + (void)qp; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + //EB_U64 lumaSad, chromaSad; - // Number of bits for each synatax element - EB_U64 predModeBitsNum = 0; - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 intraLumaModeBitsNum = 0; - (void)qp; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - //EB_U64 lumaSad, chromaSad; + // Luma and chroma distortion + EB_U64 totalDistortion; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Estimate Chroma Mode Bits + chromaRate = mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Chroma Mode Bits - chromaRate = mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : + ZERO_COST; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : - ZERO_COST; + // Estimate Pred Mode Bits + predModeBitsNum = mdRateEstimationPtr->predModeBits[candidateType]; - // Estimate Pred Mode Bits - predModeBitsNum = mdRateEstimationPtr->predModeBits[candidateType]; + // Estimate Luma Mode Bits for Intra + IntraLumaModeContext( + cuPtr, + lumaMode, + &predictionIndex); - // Estimate Luma Mode Bits for Intra - IntraLumaModeContext( - cuPtr, - lumaMode, - &predictionIndex); + intraLumaModeBitsNum = (predictionIndex != -1) ? + mdRateEstimationPtr->intraLumaBits[predictionIndex] : + mdRateEstimationPtr->intraLumaBits[3]; - intraLumaModeBitsNum = (predictionIndex != -1) ? - mdRateEstimationPtr->intraLumaBits[predictionIndex] : - mdRateEstimationPtr->intraLumaBits[3]; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + predModeBitsNum + + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - predModeBitsNum + - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Keep the Fast Luma and Chroma rate for future use + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = chromaRate; - // Keep the Fast Luma and Chroma rate for future use - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = chromaRate; + candidateBufferPtr->residualLumaSad = lumaDistortion; - candidateBufferPtr->residualLumaSad = lumaDistortion; + // include luma only in total distortion + totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; - // include luma only in total distortion - totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; - - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } EB_ERRORTYPE IntraNxNFullCostIslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; - EB_U32 crCbf; - EB_U32 cbCbf; + EB_U32 yCbf; + EB_U32 crCbf; + EB_U32 cbCbf; - EB_U32 chromaCbfCtx; + EB_U32 chromaCbfCtx; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; - EB_U64 cbfChromaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; + EB_U64 cbfChromaFlagBitsNum; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - (void)pictureControlSetPtr; + (void)pictureControlSetPtr; - yCbf = candidateBufferPtr->candidatePtr->yCbf; - crCbf = candidateBufferPtr->candidatePtr->crCbf; - cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + yCbf = candidateBufferPtr->candidatePtr->yCbf; + crCbf = candidateBufferPtr->candidatePtr->crCbf; + cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; - cbfChromaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; + cbfChromaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits - chromaCbfCtx = 2/*cuPtr->sizeLog2*/ - Log2f(transformSize); + // Estimate the Transform Split Flag & the Cbf's Bits + chromaCbfCtx = 2/*cuPtr->sizeLog2*/ - Log2f(transformSize); - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) - // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) - // Add Log2 of Transform size in order to calculating it multiple time in this function - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) + // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) + // Add Log2 of Transform size in order to calculating it multiple time in this function + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight - distortion = lumaSse + chromaSse; + distortion = lumaSse + chromaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } EB_ERRORTYPE IntraNxNFullCostPslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; - EB_U32 crCbf; - EB_U32 cbCbf; + EB_U32 yCbf; + EB_U32 crCbf; + EB_U32 cbCbf; - EB_U32 chromaCbfCtx; + EB_U32 chromaCbfCtx; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; - EB_U64 cbfChromaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; + EB_U64 cbfChromaFlagBitsNum; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - yCbf = candidateBufferPtr->candidatePtr->yCbf; - crCbf = candidateBufferPtr->candidatePtr->crCbf; - cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + yCbf = candidateBufferPtr->candidatePtr->yCbf; + crCbf = candidateBufferPtr->candidatePtr->crCbf; + cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; - cbfChromaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; + cbfChromaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits + // Estimate the Transform Split Flag & the Cbf's Bits - chromaCbfCtx = /*cuPtr->sizeLog2*/ 2 - Log2f(transformSize); + chromaCbfCtx = /*cuPtr->sizeLog2*/ 2 - Log2f(transformSize); - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) - // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) - // Add Log2 of Transform size in order to calculating it multiple time in this function + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) + // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) + // Add Log2 of Transform size in order to calculating it multiple time in this function - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - chromaSse = (((chromaSse * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + chromaSse = (((chromaSse * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } - distortion = lumaSse + chromaSse; + distortion = lumaSse + chromaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } diff --git a/Source/Lib/Codec/EbRateDistortionCost.h b/Source/Lib/Codec/EbRateDistortionCost.h index 4099918ec..eb230dd00 100644 --- a/Source/Lib/Codec/EbRateDistortionCost.h +++ b/Source/Lib/Codec/EbRateDistortionCost.h @@ -15,14 +15,14 @@ #include "EbLambdaRateTables.h" #include "EbTransforms.h" #include "EbModeDecisionProcess.h" -#include "EbEncDecProcess.h" +#include "EbEncDecProcess.h" #ifdef __cplusplus extern "C" { #endif - extern void CodingLoopContextGeneration( - ModeDecisionContext_t *contextPtr, + extern void CodingLoopContextGeneration( + ModeDecisionContext_t *contextPtr, CodingUnit_t *cuPtr, EB_U32 cuOriginX, EB_U32 cuOriginY, @@ -32,8 +32,8 @@ extern "C" { NeighborArrayUnit_t *modeTypeNeighborArray, NeighborArrayUnit_t *leafDepthNeighborArray); - extern void ModeDecisionRefinementContextGeneration( - ModeDecisionContext_t *contextPtr, + extern void ModeDecisionRefinementContextGeneration( + ModeDecisionContext_t *contextPtr, CodingUnit_t *cuPtr, EB_U32 cuOriginX, EB_U32 cuOriginY, @@ -51,15 +51,15 @@ extern EB_ERRORTYPE TuCalcCost( EB_U32 cbCountNonZeroCoeffs, EB_U32 crCountNonZeroCoeffs, EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 cbTuDistortion[DIST_CALC_TOTAL], - EB_U64 crTuDistortion[DIST_CALC_TOTAL], + EB_U64 cbTuDistortion[DIST_CALC_TOTAL], + EB_U64 crTuDistortion[DIST_CALC_TOTAL], EB_U32 componentMask, - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 qp, - EB_U64 lambda, - EB_U64 lambdaChroma); + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 qp, + EB_U64 lambda, + EB_U64 lambdaChroma); extern EB_ERRORTYPE TuCalcCostLuma( @@ -69,9 +69,9 @@ extern EB_ERRORTYPE TuCalcCostLuma( EB_U32 transformSize, EB_U32 yCountNonZeroCoeffs, EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 *yTuCoeffBits, - EB_U32 qp, - EB_U64 lambda, + EB_U64 *yTuCoeffBits, + EB_U32 qp, + EB_U64 lambda, EB_U64 lambdaChroma); extern EB_ERRORTYPE IntraLumaModeContext( @@ -81,37 +81,37 @@ extern EB_ERRORTYPE IntraLumaModeContext( extern EB_ERRORTYPE Intra2Nx2NFastCostIsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE Intra2Nx2NFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, + EB_U32 qp, EB_U64 lumaDistortion, - EB_U64 chromaDistortion, + EB_U64 chromaDistortion, EB_U64 lambda, PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE IntraFullCostIslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -126,11 +126,11 @@ extern EB_ERRORTYPE IntraFullCostIslice( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE IntraFullCostPslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -145,7 +145,7 @@ extern EB_ERRORTYPE IntraFullCostPslice( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE IntraFullLumaCostIslice( CodingUnit_t *cuPtr, @@ -162,34 +162,34 @@ EB_ERRORTYPE IntraFullLumaCostPslice( EB_U32 cuSize, EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, + EB_U64 *yDistortion, EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); extern EB_ERRORTYPE InterFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE InterFastCostBsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, -struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + CodingUnit_t *cuPtr, +struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE InterFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -204,22 +204,22 @@ extern EB_ERRORTYPE InterFullCost( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE InterFullLumaCost( CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, + EB_U64 *yDistortion, EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); extern EB_ERRORTYPE MergeSkipFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -234,20 +234,20 @@ extern EB_ERRORTYPE MergeSkipFullCost( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE MergeSkipFullLumaCost( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, + EB_U64 *yDistortion, EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); extern EB_ERRORTYPE SplitFlagRate( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, CodingUnit_t *cuPtr, EB_U32 splitFlag, EB_U64 *splitRate, @@ -255,13 +255,13 @@ extern EB_ERRORTYPE SplitFlagRate( MdRateEstimationContext_t *mdRateEstimationPtr, EB_U32 tbMaxDepth); -extern EB_ERRORTYPE EncodeTuCalcCost( +extern EB_ERRORTYPE EncodeTuCalcCost( EncDecContext_t *contextPtr, - EB_U32 *countNonZeroCoeffs, - EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 *yTuCoeffBits, - EB_U32 componentMask - ); + EB_U32 *countNonZeroCoeffs, + EB_U64 yTuDistortion[DIST_CALC_TOTAL], + EB_U64 *yTuCoeffBits, + EB_U32 componentMask + ); @@ -271,7 +271,7 @@ extern EB_ERRORTYPE Intra4x4FastCostIslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, EB_U64 lumaDistortion, EB_U64 lambda); - + extern EB_ERRORTYPE Intra4x4FastCostPslice( ModeDecisionContext_t *contextPtr, EB_U32 puIndex, @@ -285,7 +285,7 @@ extern EB_ERRORTYPE Intra4x4FullCostIslice( EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); - + extern EB_ERRORTYPE Intra4x4FullCostPslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, EB_U64 *yDistortion, @@ -294,49 +294,49 @@ extern EB_ERRORTYPE Intra4x4FullCostPslice( EB_U32 transformSize); EB_ERRORTYPE IntraNxNFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE IntraNxNFastCostPslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE IntraNxNFullCostIslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); EB_ERRORTYPE IntraNxNFullCostPslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbReferenceObject.c b/Source/Lib/Codec/EbReferenceObject.c index f098abc20..ff6955f7f 100644 --- a/Source/Lib/Codec/EbReferenceObject.c +++ b/Source/Lib/Codec/EbReferenceObject.c @@ -25,9 +25,9 @@ void InitializeSamplesNeighboringReferencePicture16Bit( EB_MEMSET((EB_U8*)reconSamplesPtr, 0, sizeof(EB_U16)*(1 + reconWidth + 1)); // 2. Zero out the bottom row - reconSamplesPtr = (EB_U16*)reconSamplesBufferPtr + (topPadding + reconHeight) * stride + leftPadding - 1; + reconSamplesPtr = (EB_U16*)reconSamplesBufferPtr + (topPadding + reconHeight) * stride + leftPadding - 1; EB_MEMSET((EB_U8*)reconSamplesPtr, 0, sizeof(EB_U16)*(1 + reconWidth + 1)); - + // 3. Zero out the left column reconSamplesPtr = (EB_U16*)reconSamplesBufferPtr + topPadding * stride + leftPadding - 1; for (sampleCount = 0; sampleCount < reconHeight; sampleCount++) { @@ -57,9 +57,9 @@ void InitializeSamplesNeighboringReferencePicture8Bit( EB_MEMSET(reconSamplesPtr, 0, sizeof(EB_U8)*(1 + reconWidth + 1)); // 2. Zero out the bottom row - reconSamplesPtr = reconSamplesBufferPtr + (topPadding + reconHeight) * stride + leftPadding - 1; + reconSamplesPtr = reconSamplesBufferPtr + (topPadding + reconHeight) * stride + leftPadding - 1; EB_MEMSET(reconSamplesPtr, 0, sizeof(EB_U8)*(1 + reconWidth + 1)); - + // 3. Zero out the left column reconSamplesPtr = reconSamplesBufferPtr + topPadding * stride + leftPadding - 1; for (sampleCount = 0; sampleCount < reconHeight; sampleCount++) { @@ -105,7 +105,7 @@ void InitializeSamplesNeighboringReferencePicture( pictureBufferDescInitDataPtr->topPadding >> 1); } else { - + InitializeSamplesNeighboringReferencePicture8Bit( referenceObject->referencePicture->bufferY, referenceObject->referencePicture->strideY, @@ -135,12 +135,12 @@ void InitializeSamplesNeighboringReferencePicture( /***************************************** * EbPictureBufferDescCtor - * Initializes the Buffer Descriptor's + * Initializes the Buffer Descriptor's * values that are fixed for the life of * the descriptor. *****************************************/ EB_ERRORTYPE EbReferenceObjectCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { @@ -178,13 +178,13 @@ EB_ERRORTYPE EbReferenceObjectCtor( pictureBufferDescInitData16BitPtr.bitDepth); } - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } - // Allocate LCU based TMVP map + // Allocate LCU based TMVP map EB_MALLOC(TmvpUnit_t *, referenceObject->tmvpMap, (sizeof(TmvpUnit_t) * (((pictureBufferDescInitDataPtr->maxWidth + (64 - 1)) >> 6) * ((pictureBufferDescInitDataPtr->maxHeight + (64 - 1)) >> 6))), EB_N_PTR); //RESTRICT THIS TO M4 @@ -194,7 +194,7 @@ EB_ERRORTYPE EbReferenceObjectCtor( bufDesc.maxWidth = pictureBufferDescInitDataPtr->maxWidth; bufDesc.maxHeight = pictureBufferDescInitDataPtr->maxHeight; bufDesc.bitDepth = EB_8BIT; - bufDesc.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; + bufDesc.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; bufDesc.leftPadding = pictureBufferDescInitDataPtr->leftPadding; bufDesc.rightPadding = pictureBufferDescInitDataPtr->rightPadding; bufDesc.topPadding = pictureBufferDescInitDataPtr->topPadding; @@ -207,19 +207,19 @@ EB_ERRORTYPE EbReferenceObjectCtor( (EB_PTR)&bufDesc); if (return_error == EB_ErrorInsufficientResources) return EB_ErrorInsufficientResources; - } + } return EB_ErrorNone; } /***************************************** * EbPaReferenceObjectCtor - * Initializes the Buffer Descriptor's + * Initializes the Buffer Descriptor's * values that are fixed for the life of * the descriptor. *****************************************/ EB_ERRORTYPE EbPaReferenceObjectCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { @@ -237,8 +237,8 @@ EB_ERRORTYPE EbPaReferenceObjectCtor( return EB_ErrorInsufficientResources; } - // Quarter Decim reference picture constructor - paReferenceObject->quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; + // Quarter Decim reference picture constructor + paReferenceObject->quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; return_error = EbPictureBufferDescCtor( (EB_PTR*) &(paReferenceObject->quarterDecimatedPicturePtr), (EB_PTR ) (pictureBufferDescInitDataPtr + 1)); @@ -247,14 +247,14 @@ EB_ERRORTYPE EbPaReferenceObjectCtor( } // Sixteenth Decim reference picture constructor - paReferenceObject->sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; + paReferenceObject->sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; return_error = EbPictureBufferDescCtor( (EB_PTR*) &(paReferenceObject->sixteenthDecimatedPicturePtr), (EB_PTR ) (pictureBufferDescInitDataPtr + 2)); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbReferenceObject.h b/Source/Lib/Codec/EbReferenceObject.h index 89a868beb..80d8c5189 100644 --- a/Source/Lib/Codec/EbReferenceObject.h +++ b/Source/Lib/Codec/EbReferenceObject.h @@ -7,34 +7,34 @@ #define EbReferenceObject_h #include "EbDefinitions.h" -#include "EbAdaptiveMotionVectorPrediction.h" +#include "EbAdaptiveMotionVectorPrediction.h" #ifdef __cplusplus extern "C" { #endif typedef struct EbReferenceObject_s { EbPictureBufferDesc_t *referencePicture; - EbPictureBufferDesc_t *referencePicture16bit; - EbPictureBufferDesc_t *refDenSrcPicture; + EbPictureBufferDesc_t *referencePicture16bit; + EbPictureBufferDesc_t *refDenSrcPicture; - TmvpUnit_t *tmvpMap; + TmvpUnit_t *tmvpMap; EB_BOOL tmvpEnableFlag; EB_U64 refPOC; EB_U8 qp; EB_PICTURE sliceType; - EB_U8 intraCodedArea;//percentage of intra coded area 0-100% + EB_U8 intraCodedArea;//percentage of intra coded area 0-100% - EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% - EB_U32 nonMovingIndexArray[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//array to hold non-moving blocks in reference frames - EB_U32 picSampleValue[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT][3];// [Y U V]; + EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% + EB_U32 nonMovingIndexArray[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//array to hold non-moving blocks in reference frames + EB_U32 picSampleValue[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT][3];// [Y U V]; - EB_BOOL penalizeSkipflag; + EB_BOOL penalizeSkipflag; - EB_U8 tmpLayerIdx; - EB_BOOL isSceneChange; - EB_U16 picAvgVariance; + EB_U8 tmpLayerIdx; + EB_BOOL isSceneChange; + EB_U16 picAvgVariance; EB_U8 averageIntensity; } EbReferenceObject_t; @@ -45,13 +45,13 @@ typedef struct EbReferenceObjectDescInitData_s { typedef struct EbPaReferenceObject_s { EbPictureBufferDesc_t *inputPaddedPicturePtr; - EbPictureBufferDesc_t *quarterDecimatedPicturePtr; + EbPictureBufferDesc_t *quarterDecimatedPicturePtr; EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; - EB_U16 variance[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; - EB_U8 yMean[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; - EB_PICTURE sliceType; + EB_U16 variance[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; + EB_U8 yMean[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; + EB_PICTURE sliceType; - EB_U32 dependentPicturesCount; //number of pic using this reference frame + EB_U32 dependentPicturesCount; //number of pic using this reference frame PictureParentControlSet_t *pPcsPtr; } EbPaReferenceObject_t; @@ -65,14 +65,14 @@ typedef struct EbPaReferenceObjectDescInitData_s { * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EbReferenceObjectCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE EbPaReferenceObjectCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus } #endif -#endif //EbReferenceObject_h \ No newline at end of file +#endif //EbReferenceObject_h diff --git a/Source/Lib/Codec/EbResourceCoordinationProcess.h b/Source/Lib/Codec/EbResourceCoordinationProcess.h index 24b12a2a1..e3ae56a25 100644 --- a/Source/Lib/Codec/EbResourceCoordinationProcess.h +++ b/Source/Lib/Codec/EbResourceCoordinationProcess.h @@ -15,7 +15,7 @@ extern "C" { * Context ***************************************/ typedef struct ResourceCoordinationContext_s -{ +{ EbFifo_t *inputBufferFifoPtr; EbFifo_t *resourceCoordinationResultsOutputFifoPtr; @@ -24,35 +24,35 @@ typedef struct ResourceCoordinationContext_s EbObjectWrapper_t **sequenceControlSetActiveArray; EbFifo_t *sequenceControlSetEmptyFifoPtr; EbCallback_t **appCallbackPtrArray; - + // Compute Segments EB_U32 *computeSegmentsTotalCountArray; EB_U32 encodeInstancesTotalCount; - + // Picture Number Array EB_U64 *pictureNumberArray; - EB_U64 averageEncMod; - EB_U8 prevEncMod; - EB_S8 prevEncModeDelta; - EB_U8 prevChangeCond; + EB_U64 averageEncMod; + EB_U8 prevEncMod; + EB_S8 prevEncModeDelta; + EB_U8 prevChangeCond; - EB_S64 previousModeChangeBuffer; - EB_S64 previousModeChangeFrameIn; - EB_S64 previousBufferCheck1; - EB_S64 previousFrameInCheck1; - EB_S64 previousFrameInCheck2; - EB_S64 previousFrameInCheck3; + EB_S64 previousModeChangeBuffer; + EB_S64 previousModeChangeFrameIn; + EB_S64 previousBufferCheck1; + EB_S64 previousFrameInCheck1; + EB_S64 previousFrameInCheck2; + EB_S64 previousFrameInCheck3; - EB_U64 curSpeed; // speed x 1000 + EB_U64 curSpeed; // speed x 1000 EB_U64 prevsTimeSeconds; EB_U64 prevsTimeuSeconds; - EB_S64 prevFrameOut; + EB_S64 prevFrameOut; EB_U64 firstInPicArrivedTimeSeconds; EB_U64 firstInPicArrivedTimeuSeconds; - EB_BOOL startFlag; + EB_BOOL startFlag; } ResourceCoordinationContext_t; @@ -69,11 +69,11 @@ extern EB_ERRORTYPE ResourceCoordinationContextCtor( EbCallback_t **appCallbackPtrArray, EB_U32 *computeSegmentsTotalCountArray, EB_U32 encodeInstancesTotalCount); - - + + extern void* ResourceCoordinationKernel(void *inputPtr); #ifdef __cplusplus } #endif -#endif // EbResourceCoordination_h \ No newline at end of file +#endif // EbResourceCoordination_h diff --git a/Source/Lib/Codec/EbResourceCoordinationResults.h b/Source/Lib/Codec/EbResourceCoordinationResults.h index 357eef834..919ae09fb 100644 --- a/Source/Lib/Codec/EbResourceCoordinationResults.h +++ b/Source/Lib/Codec/EbResourceCoordinationResults.h @@ -17,7 +17,7 @@ extern "C" { typedef struct ResourceCoordinationResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; - + } ResourceCoordinationResults_t; typedef struct ResourceCoordinationResultInitData_s @@ -29,11 +29,11 @@ typedef struct ResourceCoordinationResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE ResourceCoordinationResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus } -#endif -#endif //EbResourceCoordinationResults_h \ No newline at end of file +#endif +#endif //EbResourceCoordinationResults_h diff --git a/Source/Lib/Codec/EbSampleAdaptiveOffset.h b/Source/Lib/Codec/EbSampleAdaptiveOffset.h index 89619a839..156f4ae1f 100644 --- a/Source/Lib/Codec/EbSampleAdaptiveOffset.h +++ b/Source/Lib/Codec/EbSampleAdaptiveOffset.h @@ -22,23 +22,23 @@ extern EB_ERRORTYPE SaoStatsCtor(SaoStats_t **saoStatsPtr); extern EB_ERRORTYPE SaoGenerationDecision( - SaoStats_t *saoStats, - SaoParameters_t *saoParams, - MdRateEstimationContext_t *mdRateEstimationPtr, - EB_U64 fullLambda, + SaoStats_t *saoStats, + SaoParameters_t *saoParams, + MdRateEstimationContext_t *mdRateEstimationPtr, + EB_U64 fullLambda, EB_U64 fullChromaLambdaSao, EB_BOOL mmSAO, struct PictureControlSet_s *pictureControlSetPtr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - SaoParameters_t *saoPtr, - SaoParameters_t *leftSaoPtr, - SaoParameters_t *upSaoPtr, - EB_S64 *saoLumaBestCost, - EB_S64 *saoChromaBestCost); + EB_U32 tbOriginX, + EB_U32 tbOriginY, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + SaoParameters_t *saoPtr, + SaoParameters_t *leftSaoPtr, + SaoParameters_t *upSaoPtr, + EB_S64 *saoLumaBestCost, + EB_S64 *saoChromaBestCost); extern EB_ERRORTYPE SaoGenerationDecision16bit( @@ -47,8 +47,8 @@ extern EB_ERRORTYPE SaoGenerationDecision16bit( SaoParameters_t *saoParams, MdRateEstimationContext_t *mdRateEstimationPtr, EB_U64 fullLambda, - EB_U64 fullChromaLambdaSao, - EB_BOOL mmSAO, + EB_U64 fullChromaLambdaSao, + EB_BOOL mmSAO, struct PictureControlSet_s *pictureControlSetPtr, EB_U32 tbOriginX, EB_U32 tbOriginY, @@ -62,16 +62,16 @@ struct PictureControlSet_s *pictureControlSetPtr, EB_ERRORTYPE GatherSaoStatisticsLcu16bit_SSE2( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] typedef EB_ERRORTYPE(*EB_SAOGATHER_FUNC)( @@ -158,22 +158,22 @@ typedef EB_ERRORTYPE(*EB_SAOAPPLY_EO_135_45_16bit_FUNC)( EB_U32 lcuWidth); typedef EB_ERRORTYPE(*EB_SAOGATHER_16bit_FUNC)( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] static const EB_SAOGATHER_16bit_FUNC SaoGatherFunctionTabl_16bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - GatherSaoStatisticsLcu_62x62_16bit, - // AVX2 - GatherSaoStatisticsLcu16bit_SSE2, + // C_DEFAULT + GatherSaoStatisticsLcu_62x62_16bit, + // AVX2 + GatherSaoStatisticsLcu16bit_SSE2, }; @@ -181,29 +181,29 @@ static const EB_SAOGATHER_16bit_FUNC SaoGatherFunctionTabl_16bit[EB_ASM_TYPE_TOT static const EB_SAOGATHER_FUNC SaoGatherFunctionTableLossy[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT GatherSaoStatisticsLcuLossy_62x62, - // AVX2 + // AVX2 GatherSaoStatisticsLcu_BT_SSE2, }; static const EB_SAOGATHER_90_45_135_FUNC SaoGatherFunctionTableLossy_90_45_135[EB_ASM_TYPE_TOTAL]= { - // C_DEFAULT + // C_DEFAULT GatherSaoStatisticsLcu_OnlyEo_90_45_135_Lossy, - // AVX2 - GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2, + // AVX2 + GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2, }; static const EB_SAOGATHER_90_45_135_16bit_SSE2_FUNC SaoGatherFunctionTable_90_45_135_16bit_SSE2[EB_ASM_TYPE_TOTAL][2] = { - // C_DEFAULT - { + // C_DEFAULT + { GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, - }, - // AVX2 - { - GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, - GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN, - }, + }, + // AVX2 + { + GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, + GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN, + }, }; @@ -215,13 +215,13 @@ static const EB_SAOAPPLY_BO_FUNC SaoFunctionTableBo[EB_ASM_TYPE_TOTAL][2] = { }, // AVX2 { - SAOApplyBO, - SAOApplyBO_BT_SSSE3 + SAOApplyBO, + SAOApplyBO_BT_SSSE3 }, }; static const EB_SAOAPPLY_EO_0_90_FUNC SaoFunctionTableEO_0_90[EB_ASM_TYPE_TOTAL][2][2] = { - // C_DEFAULT + // C_DEFAULT { { SAOApplyEO_0, @@ -232,7 +232,7 @@ static const EB_SAOAPPLY_EO_0_90_FUNC SaoFunctionTableEO_0_90[EB_ASM_TYPE_TOTAL] SAOApplyEO_90 } }, - // AVX2 + // AVX2 { { SAOApplyEO_0, @@ -246,70 +246,70 @@ static const EB_SAOAPPLY_EO_0_90_FUNC SaoFunctionTableEO_0_90[EB_ASM_TYPE_TOTAL] }; static const EB_SAOAPPLY_EO_135_45_FUNC SaoFunctionTableEO_135_45[EB_ASM_TYPE_TOTAL][2][2][2] = { - // C_DEFAULT - { + // C_DEFAULT + { { - { - SAOApplyEO_135, - SAOApplyEO_135 - }, - { - SAOApplyEO_135, - SAOApplyEO_135 - } + { + SAOApplyEO_135, + SAOApplyEO_135 + }, + { + SAOApplyEO_135, + SAOApplyEO_135 + } }, { - { + { SAOApplyEO_45, SAOApplyEO_45 - }, - { + }, + { SAOApplyEO_45, SAOApplyEO_45 - } + } } }, - // AVX2 - { + // AVX2 + { { - { - SAOApplyEO_135, + { + SAOApplyEO_135, SAOApplyEO_135_BT_SSSE3 - }, - { - SAOApplyEO_135, + }, + { + SAOApplyEO_135, SAOApplyEO_135_BT_SSSE3 - } + } }, { - { + { SAOApplyEO_45, SAOApplyEO_45_BT_SSSE3 - }, - { + }, + { SAOApplyEO_45, - SAOApplyEO_45_BT_SSSE3 - } + SAOApplyEO_45_BT_SSSE3 + } } }, }; -static const EB_SAOAPPLY_BO_16bit_FUNC SaoFunctionTableBo_16bit[EB_ASM_TYPE_TOTAL][2] = { - // C_DEFAULT - { +static const EB_SAOAPPLY_BO_16bit_FUNC SaoFunctionTableBo_16bit[EB_ASM_TYPE_TOTAL][2] = { + // C_DEFAULT + { SAOApplyBO16bit, SAOApplyBO16bit - }, - // AVX2 - { - SAOApplyBO16bit, - SAOApplyBO16bit_SSE2_INTRIN - }, + }, + // AVX2 + { + SAOApplyBO16bit, + SAOApplyBO16bit_SSE2_INTRIN + }, }; static const EB_SAOAPPLY_EO_0_90_16bit_FUNC SaoFunctionTableEO_0_90_16bit[EB_ASM_TYPE_TOTAL][2][2] = { - // C_DEFAULT + // C_DEFAULT { { SAOApplyEO_0_16bit, @@ -320,7 +320,7 @@ static const EB_SAOAPPLY_EO_0_90_16bit_FUNC SaoFunctionTableEO_0_90_16bit[EB_ASM SAOApplyEO_90_16bit } }, - // AVX2 + // AVX2 { { SAOApplyEO_0_16bit, @@ -334,26 +334,26 @@ static const EB_SAOAPPLY_EO_0_90_16bit_FUNC SaoFunctionTableEO_0_90_16bit[EB_ASM }; static const EB_SAOAPPLY_EO_135_45_16bit_FUNC SaoFunctionTableEO_135_45_16bit[EB_ASM_TYPE_TOTAL][2][2] = { - // C_DEFAULT + // C_DEFAULT { { - SAOApplyEO_135_16bit, - SAOApplyEO_135_16bit + SAOApplyEO_135_16bit, + SAOApplyEO_135_16bit }, { SAOApplyEO_45_16bit, SAOApplyEO_45_16bit } }, - // AVX2 + // AVX2 { { - SAOApplyEO_135_16bit, + SAOApplyEO_135_16bit, SAOApplyEO_135_16bit_SSE2_INTRIN }, { - SAOApplyEO_45_16bit, - SAOApplyEO_45_16bit_SSE2_INTRIN + SAOApplyEO_45_16bit, + SAOApplyEO_45_16bit_SSE2_INTRIN } }, }; diff --git a/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c b/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c index f08660987..e8be8fa8d 100644 --- a/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c +++ b/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c @@ -23,7 +23,7 @@ static EB_S32 MinSaoOffsetvalueBO[2 /*8bit+10bit*/] = { -7 ,-31 }; ********************************************/ EB_ERRORTYPE SaoStatsCtor(SaoStats_t **saoStatsPtr) { - EB_U32 videoComponent; + EB_U32 videoComponent; SaoStats_t *saoStats; EB_MALLOC(SaoStats_t*, saoStats, sizeof(SaoStats_t), EB_N_PTR); @@ -228,7 +228,7 @@ static void DetermineSaoChromaModeOffsets( #else // BO Candidates for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - boBestCost = (maxCost >> 1); + boBestCost = (maxCost >> 1); for (boIndex = 0; boIndex < SAO_BO_INTERVALS; ++boIndex) { boOffset[chromaComponent - 1][boIndex] = (saoStats->boCount[chromaComponent][boIndex] == 0) ? 0 : @@ -267,7 +267,7 @@ static void DetermineSaoChromaModeOffsets( boChromaBestCost += boBestCost; } #endif - // EO Candidates + // EO Candidates eoChromaBestCost = (maxCost >> 1); @@ -353,21 +353,21 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( EB_U64 lambda, // input parameter, lambda, used to compute the cost MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost EB_S64 *saoLumaBestCost, // output parameter, best SAO Luma cost - EB_BOOL is10bit ) + EB_BOOL is10bit ) { EB_U32 eoType, eoIndex, bestEotype=0, saoOffset; EB_U64 maxCost = (EB_U64) ~0; EB_S32 eoOffset[SAO_EO_TYPES][SAO_EO_CATEGORIES]; EB_S64 eoCategoryDistortion[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - EB_S64 eoTypeDistortion[SAO_EO_TYPES] = {0}; + EB_S64 eoTypeDistortion[SAO_EO_TYPES] = {0}; EB_S64 eoTypeRate[SAO_EO_TYPES] = {0}; EB_S64 eoTypeCost[SAO_EO_TYPES]; - EB_S64 eoBestCost = (maxCost >> 1); + EB_S64 eoBestCost = (maxCost >> 1); EB_U64 saoOffsetFlagBitsNum; EB_S64 saoOffRate; - EB_S64 saoOffCost; + EB_S64 saoOffCost; EB_U32 distortionShift = is10bit ? 4 : 0; // *Note: in all Cost Computations we are not including the Cost of the Merge Left & Up Costs - they will be added later in TestSaoCopyModes() @@ -380,7 +380,7 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( saoParams->saoOffset[SAO_COMPONENT_LUMA][2] = 0; saoParams->saoOffset[SAO_COMPONENT_LUMA][3] = 0; saoParams->saoBandPosition[SAO_COMPONENT_LUMA] = 0; - + // EO Candidates for (eoType = 1; eoType < SAO_EO_TYPES; ++eoType ) { @@ -410,14 +410,14 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( eoBestCost = eoTypeCost[eoType]; bestEotype = eoType; - } + } } - eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] *lambda) + MD_OFFSET) >> MD_SHIFT); + eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] *lambda) + MD_OFFSET) >> MD_SHIFT); if ( eoBestCost < saoOffCost) { - + *saoLumaBestCost = eoBestCost; saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = bestEotype + 1; for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { @@ -439,72 +439,72 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( ********************************************/ static void TestSaoCopyModes( EB_S32 **boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 **boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1], + EB_U16 **boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1], EB_U16 eoCount[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1], SaoParameters_t *saoPtr, // input/output parameter, LCU Ptr, used to store SAO results - SaoParameters_t *leftSaoPtr, // input parameter, left LCU Ptr, used to detect the availability of the left neighbor candidate - SaoParameters_t *upSaoPtr, // input parameter, up LCU Ptr, used to detect the availability of the top neighbor candidate + SaoParameters_t *leftSaoPtr, // input parameter, left LCU Ptr, used to detect the availability of the left neighbor candidate + SaoParameters_t *upSaoPtr, // input parameter, up LCU Ptr, used to detect the availability of the top neighbor candidate EB_U64 lambda, // input parameter, lambda, used to compute the cost MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost EB_S64 *saoLumaBestCost, // input/output parameter, best SAO Luma cost EB_S64 *saoChromaBestCost, // input/output parameter, best SAO Chroma cost EB_BOOL is10bit - ) + ) { EB_U32 chromaComponent, videoComponent, isChromaComponent, saoOffset; EB_U64 maxCost = (EB_U64)~0; - EB_S64 saoLumaLeftMergeDistortion = 0; - EB_S64 saoChromaLeftMergeDistortion = 0; + EB_S64 saoLumaLeftMergeDistortion = 0; + EB_S64 saoChromaLeftMergeDistortion = 0; EB_U64 saoMergeLeftFlagBitsNum; EB_S64 saoMergeLeftRate; - EB_S64 saoLumaMergeLeftCost = 0; + EB_S64 saoLumaMergeLeftCost = 0; EB_S64 saoChromaMergeLeftCost = 0; EB_S64 saoMergeLeftCost = (maxCost >> 1); - EB_S64 saoLumaUpMergeDistortion = 0; - EB_S64 saoChromaUpMergeDistortion = 0; - EB_U64 saoMergeUpFlagBitsNum; + EB_S64 saoLumaUpMergeDistortion = 0; + EB_S64 saoChromaUpMergeDistortion = 0; + EB_U64 saoMergeUpFlagBitsNum; EB_S64 saoMergeUpRate; - EB_S64 saoLumaMergeUpCost = 0; - EB_S64 saoChromaMergeUpCost = 0; + EB_S64 saoLumaMergeUpCost = 0; + EB_S64 saoChromaMergeUpCost = 0; EB_S64 saoMergeUpCost = (maxCost >> 1); EB_S64 saoBestCost; EB_U32 distortionShift = is10bit ? 4 : 0; - + // Add Left Flag & Up Flag costs to the best Luma & Chroma Costs in order to get the best SAO Cost - // The best SAO Cost is either SAO Off Cost or BO Cost or EO Cost - saoMergeLeftFlagBitsNum = (leftSaoPtr) ? + // The best SAO Cost is either SAO Off Cost or BO Cost or EO Cost + saoMergeLeftFlagBitsNum = (leftSaoPtr) ? mdRateEstimationPtr->saoMergeFlagBits[0] : 0; - - saoMergeUpFlagBitsNum = (upSaoPtr) ? + + saoMergeUpFlagBitsNum = (upSaoPtr) ? mdRateEstimationPtr->saoMergeFlagBits[0] : - 0; + 0; - saoBestCost = *saoLumaBestCost + *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); - *saoLumaBestCost = *saoLumaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); - *saoChromaBestCost = *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); + saoBestCost = *saoLumaBestCost + *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); + *saoLumaBestCost = *saoLumaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); + *saoChromaBestCost = *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); // Left-Neighbor Candidate - if(leftSaoPtr) { + if(leftSaoPtr) { - // Luma + // Luma if(leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] > 0) { - + if (leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] == 5) { // BO - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * boDiff[SAO_COMPONENT_LUMA][leftSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset]) + ((EB_S32)boCount[SAO_COMPONENT_LUMA][leftSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset] * SQR(leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } - } + } else { // EO - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * eoDiff[SAO_COMPONENT_LUMA][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset]) + ((EB_S32)eoCount[SAO_COMPONENT_LUMA][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset] * SQR(leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } } @@ -512,29 +512,29 @@ static void TestSaoCopyModes( // Chroma if(leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] > 0) { - + if (leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] == 5) { // BO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[chromaComponent][saoOffset] * boDiff[chromaComponent][leftSaoPtr->saoBandPosition[chromaComponent] + saoOffset]) + ((EB_S32)boCount[chromaComponent][leftSaoPtr->saoBandPosition[chromaComponent] + saoOffset] * SQR(leftSaoPtr->saoOffset[chromaComponent][saoOffset])); } - } + } } else { // EO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[chromaComponent][saoOffset] * eoDiff[chromaComponent][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset]) + ((EB_S32)eoCount[chromaComponent][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset] * SQR(leftSaoPtr->saoOffset[chromaComponent][saoOffset])); } } } } - + saoMergeLeftRate = mdRateEstimationPtr->saoMergeFlagBits[1]; //CHKN @@ -550,19 +550,19 @@ static void TestSaoCopyModes( // Top-Neighbor Candidate if(upSaoPtr) { - // Luma + // Luma if(upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] > 0) { - + if (upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] == 5) { // BO for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * boDiff[SAO_COMPONENT_LUMA][upSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset]) + ((EB_S32)boCount[SAO_COMPONENT_LUMA][upSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset] * SQR(upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } } else { // EO for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * eoDiff[SAO_COMPONENT_LUMA][upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset]) + ((EB_S32)eoCount[SAO_COMPONENT_LUMA][upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset] * SQR(upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } } @@ -570,23 +570,23 @@ static void TestSaoCopyModes( // Chroma if(upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] > 0) { - + if (upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] == 5) { // BO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[chromaComponent][saoOffset] * boDiff[chromaComponent][upSaoPtr->saoBandPosition[chromaComponent] + saoOffset]) + ((EB_S32)boCount[chromaComponent][upSaoPtr->saoBandPosition[chromaComponent] + saoOffset] * SQR(upSaoPtr->saoOffset[chromaComponent][saoOffset])); } - } + } } else { // EO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[chromaComponent][saoOffset] * eoDiff[chromaComponent][upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset]) + ((EB_S32)eoCount[chromaComponent][upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset] * SQR(upSaoPtr->saoOffset[chromaComponent][saoOffset])); } } @@ -596,13 +596,13 @@ static void TestSaoCopyModes( //CHKN saoLumaUpMergeDistortion = saoLumaUpMergeDistortion >> distortionShift; saoChromaUpMergeDistortion = saoChromaUpMergeDistortion >> distortionShift; - + saoMergeUpFlagBitsNum = mdRateEstimationPtr->saoMergeFlagBits[1]; saoMergeUpRate = saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum; saoLumaMergeUpCost = (saoLumaUpMergeDistortion << COST_PRECISION) + (((saoMergeUpRate *lambda) + MD_OFFSET) >> MD_SHIFT); saoChromaMergeUpCost = (saoChromaUpMergeDistortion << COST_PRECISION) + (((saoMergeUpRate *lambda) + MD_OFFSET) >> MD_SHIFT); saoMergeUpCost = (saoLumaUpMergeDistortion << COST_PRECISION) + (saoChromaUpMergeDistortion << COST_PRECISION) + (((saoMergeUpRate *lambda) + MD_OFFSET) >> MD_SHIFT); - + } if ((saoMergeLeftCost < saoBestCost) || (saoMergeUpCost < saoBestCost) ) { @@ -610,32 +610,32 @@ static void TestSaoCopyModes( saoBestCost = MIN(saoMergeLeftCost, saoMergeUpCost); if (saoBestCost == saoMergeLeftCost && leftSaoPtr) { - + saoPtr->saoMergeLeftFlag = EB_TRUE; - + for (videoComponent = SAO_COMPONENT_LUMA; videoComponent < SAO_COMPONENT_CHROMA_CR; ++videoComponent) { - + isChromaComponent = (videoComponent == SAO_COMPONENT_LUMA) ? SAO_COMPONENT_LUMA : SAO_COMPONENT_CHROMA; saoPtr->saoTypeIndex[isChromaComponent] = leftSaoPtr->saoTypeIndex[isChromaComponent]; saoPtr->saoBandPosition[videoComponent] = leftSaoPtr->saoBandPosition[videoComponent]; - EB_MEMCPY(saoPtr->saoOffset[videoComponent], leftSaoPtr->saoOffset[videoComponent], NUMBER_SAO_OFFSETS * sizeof(EB_S32)); + EB_MEMCPY(saoPtr->saoOffset[videoComponent], leftSaoPtr->saoOffset[videoComponent], NUMBER_SAO_OFFSETS * sizeof(EB_S32)); *saoLumaBestCost = saoLumaMergeLeftCost; - *saoChromaBestCost = saoChromaMergeLeftCost; + *saoChromaBestCost = saoChromaMergeLeftCost; } } else if (saoBestCost == saoMergeUpCost && upSaoPtr) { - + saoPtr->saoMergeUpFlag = EB_TRUE; for (videoComponent = SAO_COMPONENT_LUMA; videoComponent < SAO_COMPONENT_CHROMA_CR; ++videoComponent) { - + isChromaComponent = (videoComponent == SAO_COMPONENT_LUMA) ? SAO_COMPONENT_LUMA : SAO_COMPONENT_CHROMA; saoPtr->saoTypeIndex[isChromaComponent] = upSaoPtr->saoTypeIndex[isChromaComponent]; saoPtr->saoBandPosition[videoComponent] = upSaoPtr->saoBandPosition[videoComponent]; EB_MEMCPY(saoPtr->saoOffset[videoComponent], upSaoPtr->saoOffset[videoComponent], NUMBER_SAO_OFFSETS * sizeof(EB_S32)); *saoLumaBestCost = saoLumaMergeUpCost; - *saoChromaBestCost = saoChromaMergeUpCost; + *saoChromaBestCost = saoChromaMergeUpCost; } } } @@ -648,7 +648,7 @@ static void TestSaoCopyModes( * generates SAO offsets and chooses best SAO mode ********************************************/ EB_ERRORTYPE SaoGenerationDecision( - SaoStats_t *saoStats, + SaoStats_t *saoStats, SaoParameters_t *saoParams, MdRateEstimationContext_t *mdRateEstimationPtr, EB_U64 fullLambda, @@ -668,7 +668,7 @@ EB_ERRORTYPE SaoGenerationDecision( { EB_ERRORTYPE return_error = EB_ErrorNone; - EbPictureBufferDesc_t *inputPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr; inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; @@ -676,13 +676,13 @@ EB_ERRORTYPE SaoGenerationDecision( if(pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) reconPicturePtr = ((EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr)->referencePicture; else - reconPicturePtr = pictureControlSetPtr->reconPicturePtr; + reconPicturePtr = pictureControlSetPtr->reconPicturePtr; const EB_COLOR_FORMAT colorFormat = reconPicturePtr->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - // Intialise SAO Parameters + // Intialise SAO Parameters saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; saoParams->saoTypeIndex[SAO_COMPONENT_CHROMA] = 0; saoParams->saoOffset[SAO_COMPONENT_LUMA][0] = 0; @@ -753,7 +753,7 @@ EB_ERRORTYPE SaoGenerationDecision( saoChromaBestCost, EB_FALSE); - // Check Merge Mode Y + U + V + // Check Merge Mode Y + U + V TestSaoCopyModes( saoStats->boDiff, saoStats->boCount, @@ -827,7 +827,7 @@ EB_ERRORTYPE SaoGenerationDecision( } - //Check Merge Mode (Luma+Chroma) + //Check Merge Mode (Luma+Chroma) if (pictureControlSetPtr->temporalLayerIndex < 2) { TestSaoCopyModes( @@ -854,82 +854,82 @@ EB_ERRORTYPE SaoGenerationDecision( * generates Sao Luma Offsets ********************************************/ static void DetermineSaoEOLumaModeOffsets( - SaoStats_t *saoStats, - SaoParameters_t *saoParams, - EB_U64 lambda, // input parameter, lambda, used to compute the cost - MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost - EB_S64 *saoLumaBestCost, // output parameter, best SAO Luma cost - EB_BOOL is10bit) + SaoStats_t *saoStats, + SaoParameters_t *saoParams, + EB_U64 lambda, // input parameter, lambda, used to compute the cost + MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost + EB_S64 *saoLumaBestCost, // output parameter, best SAO Luma cost + EB_BOOL is10bit) { - EB_U32 eoType, eoIndex, bestEotype = 0, saoOffset; - EB_U64 maxCost = (EB_U64)~0; + EB_U32 eoType, eoIndex, bestEotype = 0, saoOffset; + EB_U64 maxCost = (EB_U64)~0; - EB_S32 eoOffset[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - EB_S64 eoCategoryDistortion[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - EB_S64 eoTypeDistortion[SAO_EO_TYPES] = { 0 }; - EB_S64 eoTypeRate[SAO_EO_TYPES] = { 0 }; - EB_S64 eoTypeCost[SAO_EO_TYPES]; - EB_S64 eoBestCost = (maxCost >> 1); + EB_S32 eoOffset[SAO_EO_TYPES][SAO_EO_CATEGORIES]; + EB_S64 eoCategoryDistortion[SAO_EO_TYPES][SAO_EO_CATEGORIES]; + EB_S64 eoTypeDistortion[SAO_EO_TYPES] = { 0 }; + EB_S64 eoTypeRate[SAO_EO_TYPES] = { 0 }; + EB_S64 eoTypeCost[SAO_EO_TYPES]; + EB_S64 eoBestCost = (maxCost >> 1); - EB_U64 saoOffsetFlagBitsNum; - EB_S64 saoOffRate; - EB_S64 saoOffCost; - EB_U32 distortionShift = is10bit ? 4 : 0; + EB_U64 saoOffsetFlagBitsNum; + EB_S64 saoOffRate; + EB_S64 saoOffCost; + EB_U32 distortionShift = is10bit ? 4 : 0; - // *Note: in all Cost Computations we are not including the Cost of the Merge Left & Up Costs - they will be added later in TestSaoCopyModes() - saoOffRate = mdRateEstimationPtr->saoTypeIndexBits[0]; - saoOffCost = ((saoOffRate *lambda) + MD_OFFSET) >> MD_SHIFT; + // *Note: in all Cost Computations we are not including the Cost of the Merge Left & Up Costs - they will be added later in TestSaoCopyModes() + saoOffRate = mdRateEstimationPtr->saoTypeIndexBits[0]; + saoOffCost = ((saoOffRate *lambda) + MD_OFFSET) >> MD_SHIFT; - // EO Candidates - for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { + // EO Candidates + for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { - for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES; ++eoIndex) { - eoOffset[eoType][eoIndex] = (saoStats->eoCount[0][eoType][eoIndex] == 0) ? - 0 : - ROUND(saoStats->eoDiff[0][eoType][eoIndex] / (EB_S32)saoStats->eoCount[0][eoType][eoIndex]); + for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES; ++eoIndex) { + eoOffset[eoType][eoIndex] = (saoStats->eoCount[0][eoType][eoIndex] == 0) ? + 0 : + ROUND(saoStats->eoDiff[0][eoType][eoIndex] / (EB_S32)saoStats->eoCount[0][eoType][eoIndex]); - eoOffset[eoType][eoIndex] = CLIP3(MinSaoOffsetvalueEO[is10bit][eoIndex], MaxSaoOffsetvalueEO[is10bit][eoIndex], eoOffset[eoType][eoIndex]); + eoOffset[eoType][eoIndex] = CLIP3(MinSaoOffsetvalueEO[is10bit][eoIndex], MaxSaoOffsetvalueEO[is10bit][eoIndex], eoOffset[eoType][eoIndex]); - //eoCategoryDistortion[eoType][eoIndex] = - (2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex])); - eoCategoryDistortion[eoType][eoIndex] = (-(2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex]))) >> distortionShift; + //eoCategoryDistortion[eoType][eoIndex] = - (2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex])); + eoCategoryDistortion[eoType][eoIndex] = (-(2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex]))) >> distortionShift; - eoTypeDistortion[eoType] += eoCategoryDistortion[eoType][eoIndex]; + eoTypeDistortion[eoType] += eoCategoryDistortion[eoType][eoIndex]; - } + } - GetSaoOffsetsFractionBits( - eoType + 1, - &(eoOffset[eoType][0]), - mdRateEstimationPtr, - &saoOffsetFlagBitsNum); + GetSaoOffsetsFractionBits( + eoType + 1, + &(eoOffset[eoType][0]), + mdRateEstimationPtr, + &saoOffsetFlagBitsNum); - eoTypeRate[eoType] = saoOffsetFlagBitsNum; - eoTypeCost[eoType] = (eoTypeDistortion[eoType] << COST_PRECISION) + (((eoTypeRate[eoType] * lambda) + MD_OFFSET) >> MD_SHIFT); + eoTypeRate[eoType] = saoOffsetFlagBitsNum; + eoTypeCost[eoType] = (eoTypeDistortion[eoType] << COST_PRECISION) + (((eoTypeRate[eoType] * lambda) + MD_OFFSET) >> MD_SHIFT); - if (eoTypeCost[eoType] < eoBestCost) { + if (eoTypeCost[eoType] < eoBestCost) { - eoBestCost = eoTypeCost[eoType]; - bestEotype = eoType; - } - } + eoBestCost = eoTypeCost[eoType]; + bestEotype = eoType; + } + } - // Add SAO Type Cost - eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] * lambda) + MD_OFFSET) >> MD_SHIFT); - if ((eoBestCost < saoOffCost)) { + // Add SAO Type Cost + eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] * lambda) + MD_OFFSET) >> MD_SHIFT); + if ((eoBestCost < saoOffCost)) { - *saoLumaBestCost = eoBestCost; - saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = bestEotype + 1; - for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - saoParams->saoOffset[SAO_COMPONENT_LUMA][saoOffset] = eoOffset[bestEotype][saoOffset]; - } - } - else { + *saoLumaBestCost = eoBestCost; + saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = bestEotype + 1; + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { + saoParams->saoOffset[SAO_COMPONENT_LUMA][saoOffset] = eoOffset[bestEotype][saoOffset]; + } + } + else { - saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; - *saoLumaBestCost = saoOffCost; - } + saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; + *saoLumaBestCost = saoOffCost; + } - return; + return; } /******************************************** @@ -943,8 +943,8 @@ EB_ERRORTYPE SaoGenerationDecision16bit( MdRateEstimationContext_t *mdRateEstimationPtr, EB_U64 fullLambda, - EB_U64 fullChromaLambdaSao, - EB_BOOL mmSao, + EB_U64 fullChromaLambdaSao, + EB_BOOL mmSao, PictureControlSet_t *pictureControlSetPtr, EB_U32 tbOriginX, @@ -962,13 +962,13 @@ EB_ERRORTYPE SaoGenerationDecision16bit( if(pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) recon16 = ((EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr)->referencePicture16bit; else - recon16 = pictureControlSetPtr->reconPicture16bitPtr; + recon16 = pictureControlSetPtr->reconPicture16bitPtr; const EB_COLOR_FORMAT colorFormat = recon16->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - - // Intialise SAO Parameters + + // Intialise SAO Parameters saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; saoParams->saoTypeIndex[SAO_COMPONENT_CHROMA] = 0; saoParams->saoOffset[SAO_COMPONENT_LUMA][0] = 0; @@ -981,94 +981,94 @@ EB_ERRORTYPE SaoGenerationDecision16bit( *saoLumaBestCost = 0; *saoChromaBestCost = 0; - if (mmSao) { - - EB_U32 lcuChromaWidth = lcuWidth >> subWidthCMinus1; - EB_U32 lcuChromaHeight = lcuHeight >> subHeightCMinus1; - - // Y - // Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 - // Requirement: lcuHeight > 2 - - // This function is only written in C. To be implemented in ASM - SaoGatherFunctionTabl_16bit[((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( - (EB_U16*)inputLcuPtr->bufferY, - inputLcuPtr->strideY, - (EB_U16*)(recon16->bufferY) + (recon16->originY + tbOriginY)*recon16->strideY + (recon16->originX + tbOriginX), - recon16->strideY, - lcuWidth, - lcuHeight, - saoStats->boDiff[0], - saoStats->boCount[0], - saoStats->eoDiff[0], - saoStats->eoCount[0]); - - // U - SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( - (EB_U16*)inputLcuPtr->bufferCb, - inputLcuPtr->strideCb, - (EB_U16*)(recon16->bufferCb) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), - recon16->strideCb, - lcuChromaWidth, - lcuChromaHeight, - saoStats->boDiff[1], - saoStats->boCount[1], - saoStats->eoDiff[1], - saoStats->eoCount[1]); - - // V - SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( - (EB_U16*)inputLcuPtr->bufferCr, - inputLcuPtr->strideCr, - (EB_U16*)(recon16->bufferCr) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), - recon16->strideCr, - lcuChromaWidth, - lcuChromaHeight, - saoStats->boDiff[2], - saoStats->boCount[2], - saoStats->eoDiff[2], - saoStats->eoCount[2]); - - // Y - DetermineSaoEOLumaModeOffsets( - saoStats, - saoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - EB_TRUE); - - //Chroma U+V - DetermineSaoChromaModeOffsets( - saoStats, - saoPtr, - fullChromaLambdaSao, - mdRateEstimationPtr, - saoChromaBestCost, - EB_TRUE); - - TestSaoCopyModes( - saoStats->boDiff, - saoStats->boCount, - saoStats->eoDiff, - saoStats->eoCount, - saoPtr, - leftSaoPtr, - upSaoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - saoChromaBestCost, - EB_TRUE); - - } - else { - // Y - if (pictureControlSetPtr->temporalLayerIndex == 0) { - //; Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 - //; Requirement: lcuHeight > 2 - - { + if (mmSao) { + + EB_U32 lcuChromaWidth = lcuWidth >> subWidthCMinus1; + EB_U32 lcuChromaHeight = lcuHeight >> subHeightCMinus1; + + // Y + // Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 + // Requirement: lcuHeight > 2 + + // This function is only written in C. To be implemented in ASM + SaoGatherFunctionTabl_16bit[((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( + (EB_U16*)inputLcuPtr->bufferY, + inputLcuPtr->strideY, + (EB_U16*)(recon16->bufferY) + (recon16->originY + tbOriginY)*recon16->strideY + (recon16->originX + tbOriginX), + recon16->strideY, + lcuWidth, + lcuHeight, + saoStats->boDiff[0], + saoStats->boCount[0], + saoStats->eoDiff[0], + saoStats->eoCount[0]); + + // U + SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( + (EB_U16*)inputLcuPtr->bufferCb, + inputLcuPtr->strideCb, + (EB_U16*)(recon16->bufferCb) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), + recon16->strideCb, + lcuChromaWidth, + lcuChromaHeight, + saoStats->boDiff[1], + saoStats->boCount[1], + saoStats->eoDiff[1], + saoStats->eoCount[1]); + + // V + SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( + (EB_U16*)inputLcuPtr->bufferCr, + inputLcuPtr->strideCr, + (EB_U16*)(recon16->bufferCr) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), + recon16->strideCr, + lcuChromaWidth, + lcuChromaHeight, + saoStats->boDiff[2], + saoStats->boCount[2], + saoStats->eoDiff[2], + saoStats->eoCount[2]); + + // Y + DetermineSaoEOLumaModeOffsets( + saoStats, + saoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + EB_TRUE); + + //Chroma U+V + DetermineSaoChromaModeOffsets( + saoStats, + saoPtr, + fullChromaLambdaSao, + mdRateEstimationPtr, + saoChromaBestCost, + EB_TRUE); + + TestSaoCopyModes( + saoStats->boDiff, + saoStats->boCount, + saoStats->eoDiff, + saoStats->eoCount, + saoPtr, + leftSaoPtr, + upSaoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + saoChromaBestCost, + EB_TRUE); + + } + else { + // Y + if (pictureControlSetPtr->temporalLayerIndex == 0) { + //; Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 + //; Requirement: lcuHeight > 2 + + { SaoGatherFunctionTable_90_45_135_16bit_SSE2[!!(ASM_TYPES & PREAVX2_MASK)][((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( (EB_U16*)inputLcuPtr->bufferY, inputLcuPtr->strideY, @@ -1078,10 +1078,10 @@ EB_ERRORTYPE SaoGenerationDecision16bit( lcuHeight, saoStats->eoDiff[0], saoStats->eoCount[0]); - } - } + } + } - if (pictureControlSetPtr->temporalLayerIndex == 1) { + if (pictureControlSetPtr->temporalLayerIndex == 1) { SaoGatherFunctionTable_90_45_135_16bit_SSE2[!!(ASM_TYPES & PREAVX2_MASK)][((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( (EB_U16*)inputLcuPtr->bufferY, inputLcuPtr->strideY, @@ -1091,53 +1091,53 @@ EB_ERRORTYPE SaoGenerationDecision16bit( lcuHeight, saoStats->eoDiff[0], saoStats->eoCount[0]); - } - - // Generate SAO Offsets - //Luma - if (pictureControlSetPtr->temporalLayerIndex == 0) { - - { - DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( - saoStats, - saoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - EB_TRUE); - - } - } - - if (pictureControlSetPtr->temporalLayerIndex == 1) { - - DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( - saoStats, - saoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - EB_TRUE); - } - - //Check Merge Mode (Luma+Chroma) - if (pictureControlSetPtr->temporalLayerIndex < 2) { - - TestSaoCopyModes( - saoStats->boDiff, - saoStats->boCount, - saoStats->eoDiff, - saoStats->eoCount, - saoPtr, - leftSaoPtr, - upSaoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - saoChromaBestCost, - EB_TRUE); - } - } + } + + // Generate SAO Offsets + //Luma + if (pictureControlSetPtr->temporalLayerIndex == 0) { + + { + DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( + saoStats, + saoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + EB_TRUE); + + } + } + + if (pictureControlSetPtr->temporalLayerIndex == 1) { + + DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( + saoStats, + saoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + EB_TRUE); + } + + //Check Merge Mode (Luma+Chroma) + if (pictureControlSetPtr->temporalLayerIndex < 2) { + + TestSaoCopyModes( + saoStats->boDiff, + saoStats->boCount, + saoStats->eoDiff, + saoStats->eoCount, + saoPtr, + leftSaoPtr, + upSaoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + saoChromaBestCost, + EB_TRUE); + } + } return return_error; } diff --git a/Source/Lib/Codec/EbSei.c b/Source/Lib/Codec/EbSei.c index 312117854..981deba2d 100644 --- a/Source/Lib/Codec/EbSei.c +++ b/Source/Lib/Codec/EbSei.c @@ -221,7 +221,7 @@ void EbActiveParameterSetSeiCtor( activeParameterSetSei->noParameterSetUpdateFlag = EB_FALSE; activeParameterSetSei->numSpsIdsMinus1 = 0; activeParameterSetSei->activeSeqParameterSetId = 0; -// activeParameterSetSei->layerSpsIdx = 0; +// activeParameterSetSei->layerSpsIdx = 0; return; } diff --git a/Source/Lib/Codec/EbSei.h b/Source/Lib/Codec/EbSei.h index b9d25a0fc..ed2866ca0 100644 --- a/Source/Lib/Codec/EbSei.h +++ b/Source/Lib/Codec/EbSei.h @@ -28,7 +28,7 @@ extern "C" { typedef struct RegistedUserData_s { - EB_U8 *userData; // First byte is itu_t_t35_country_code. + EB_U8 *userData; // First byte is itu_t_t35_country_code. // If itu_t_t35_country_code == 0xFF, second byte is itu_t_t35_country_code_extension_byte. // the rest are the payloadByte EB_U32 userDataSize; @@ -184,8 +184,8 @@ extern "C" { } AppRecoveryPoint_t; - // Below is an example of PanScanRectangle SEI data structure - // Other SEI messages can have data structure in this format + // Below is an example of PanScanRectangle SEI data structure + // Other SEI messages can have data structure in this format typedef struct AppPanScanRectangleSei_s { EB_U32 panScanRectId; @@ -229,10 +229,10 @@ extern "C" { typedef struct EB_LATENCY_CALC { - EB_U64 startTimesSeconds; - EB_U64 finishTimesSeconds; - EB_U64 startTimesuSeconds; - EB_U64 finishTimesuSeconds; + EB_U64 startTimesSeconds; + EB_U64 finishTimesSeconds; + EB_U64 startTimesuSeconds; + EB_U64 finishTimesuSeconds; EB_U64 poc; } EB_LATENCY_CALC; @@ -254,7 +254,7 @@ extern "C" { - // Signals that the default prediction structure and controls are to be + // Signals that the default prediction structure and controls are to be // overwritten and manually controlled. Manual control should be active // for an entire encode, from beginning to termination. Mixing of default // prediction structure control and override prediction structure control @@ -274,18 +274,18 @@ extern "C" { EB_U32 refList0Count; // A count of zero indicates the list is inactive EB_U32 refList1Count; // A count of zero indicates the list is inactive EB_BOOL isReferenced; // Indicates whether or not the picture is used as - // future reference. + // future reference. EB_U32 futureReferenceCount; EB_S32 *futureReferenceList;// Contains a list of delta POCs whose references shall // be saved for future reference. This signalling must - // be done with respect to decode picture order. Must + // be done with respect to decode picture order. Must // be conformant with the DPB rules. } EB_PRED_STRUCTURE_CFG; // EB_PICTURE_PLANE defines the data formatting of a singple plane of picture data. typedef struct EB_PICTURE_PLANE { - // "start" is the starting position of the first + // "start" is the starting position of the first // valid pixel in the picture plane. EB_U8* start; @@ -348,7 +348,7 @@ extern EB_U32 GetBufPeriodSEILength( AppVideoUsabilityInfo_t *vuiPtr); extern EB_U32 GetActiveParameterSetSEILength( - AppActiveparameterSetSei_t *activeParameterSet); + AppActiveparameterSetSei_t *activeParameterSet); extern EB_U32 GetRecoveryPointSEILength( AppRecoveryPoint_t *recoveryPointSeiPtr); diff --git a/Source/Lib/Codec/EbSequenceControlSet.c b/Source/Lib/Codec/EbSequenceControlSet.c index 22759e8c5..81510b416 100644 --- a/Source/Lib/Codec/EbSequenceControlSet.c +++ b/Source/Lib/Codec/EbSequenceControlSet.c @@ -11,8 +11,8 @@ /************************************************************************************************** General notes on how Sequence Control Sets (SCS) are used. - SequenceControlSetInstance - is the master copy that interacts with the API in real-time. When a + SequenceControlSetInstance + is the master copy that interacts with the API in real-time. When a change happens, the changeFlag is signaled so that appropriate action can be taken. There is one scsInstance per stream/encode instance. The scsInstance owns the encodeContext @@ -23,28 +23,28 @@ SequenceControlSets general SCSs are controled by a system resource manager. They are kept completely separate from the instances. In general there is one active SCS at a time. When the - changeFlag is signaled, the old active SCS is no longer used for new input pictures. + changeFlag is signaled, the old active SCS is no longer used for new input pictures. A fresh copy of the scsInstance is made to a new SCS, which becomes the active SCS. The old SCS will eventually be released back into the SCS pool when its current pictures are finished encoding. - + Motivations The whole reason for this structure is due to the nature of the pipeline. We have to - take great care not to have pipeline mismanagement. Once an object enters use in the + take great care not to have pipeline mismanagement. Once an object enters use in the pipeline, it cannot be changed on the fly or you will have pipeline coherency problems. ***************************************************************************************************/ EB_ERRORTYPE EbSequenceControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { EbSequenceControlSetInitData_t *scsInitData = (EbSequenceControlSetInitData_t*) objectInitDataPtr; - EB_U32 segmentIndex; + EB_U32 segmentIndex; EB_ERRORTYPE return_error = EB_ErrorNone; SequenceControlSet_t *sequenceControlSetPtr; EB_MALLOC(SequenceControlSet_t*, sequenceControlSetPtr, sizeof(SequenceControlSet_t), EB_N_PTR); *objectDblPtr = (EB_PTR) sequenceControlSetPtr; - + sequenceControlSetPtr->staticConfig.qp = 32; // Segments @@ -54,7 +54,7 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->encDecSegmentColCountArray[segmentIndex] = 1; sequenceControlSetPtr->encDecSegmentRowCountArray[segmentIndex] = 1; } - + // Encode Context if(scsInitData != EB_NULL) { sequenceControlSetPtr->encodeContextPtr = scsInitData->encodeContextPtr; @@ -63,8 +63,8 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->encodeContextPtr = (EncodeContext_t *)EB_NULL; } - sequenceControlSetPtr->conformanceWindowFlag = 0; - + sequenceControlSetPtr->conformanceWindowFlag = 0; + // Profile & ID sequenceControlSetPtr->spsId = 0; sequenceControlSetPtr->vpsId = 0; @@ -74,9 +74,9 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->tierIdc = 0; sequenceControlSetPtr->chromaFormatIdc = EB_YUV420; sequenceControlSetPtr->maxTemporalLayers = 1; - + sequenceControlSetPtr->bitsForPictureOrderCount = 16; - + // Picture Dimensions sequenceControlSetPtr->lumaWidth = 0; sequenceControlSetPtr->lumaHeight = 0; @@ -85,20 +85,20 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->chromaHeight = 0; sequenceControlSetPtr->frameRate = 0; sequenceControlSetPtr->encoderBitDepth = 8; - + // Bitdepth sequenceControlSetPtr->inputBitdepth = EB_8BIT; sequenceControlSetPtr->outputBitdepth = EB_8BIT; - + // GOP Structure - sequenceControlSetPtr->maxRefCount = 1; + sequenceControlSetPtr->maxRefCount = 1; sequenceControlSetPtr->intraPeriodLength = 0; sequenceControlSetPtr->intraRefreshType = 0; - + // LCU sequenceControlSetPtr->lcuSize = 64; sequenceControlSetPtr->maxLcuDepth = 3; - + // Interlaced Video sequenceControlSetPtr->interlacedVideo = EB_FALSE; @@ -111,12 +111,12 @@ EB_ERRORTYPE EbSequenceControlSetCtor( // Strong Intra Smoothing sequenceControlSetPtr->enableStrongIntraSmoothing = EB_TRUE; - + // Rate Control - sequenceControlSetPtr->rateControlMode = 0; - sequenceControlSetPtr->targetBitrate = 0x1000; + sequenceControlSetPtr->rateControlMode = 0; + sequenceControlSetPtr->targetBitrate = 0x1000; sequenceControlSetPtr->availableBandwidth = 0x1000; - + // Quantization sequenceControlSetPtr->qp = 20; @@ -125,7 +125,7 @@ EB_ERRORTYPE EbSequenceControlSetCtor( // Video Usability Info EB_MALLOC(AppVideoUsabilityInfo_t*, sequenceControlSetPtr->videoUsabilityInfoPtr, sizeof(AppVideoUsabilityInfo_t), EB_N_PTR); - + // Initialize vui parameters return_error = EbVideoUsabilityInfoCtor( sequenceControlSetPtr->videoUsabilityInfoPtr); @@ -169,11 +169,11 @@ EB_ERRORTYPE EbSequenceControlSetCtor( LcuParamsCtor( sequenceControlSetPtr); - sequenceControlSetPtr->maxDpbSize = 0; - + sequenceControlSetPtr->maxDpbSize = 0; + return EB_ErrorNone; } - + /************************************************ * Sequence Control Set Copy @@ -200,7 +200,7 @@ EB_ERRORTYPE CopySequenceControlSet( return EB_ErrorNone; } - + EB_ERRORTYPE EbSequenceControlSetInstanceCtor( EbSequenceControlSetInstance_t **objectDblPtr) { @@ -215,64 +215,64 @@ EB_ERRORTYPE EbSequenceControlSetInstanceCtor( return EB_ErrorInsufficientResources; } scsInitData.encodeContextPtr = (*objectDblPtr)->encodeContextPtr; - + return_error = EbSequenceControlSetCtor( (void **) &(*objectDblPtr)->sequenceControlSetPtr, (void *) &scsInitData); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } - + EB_CREATEMUTEX(EB_HANDLE*, (*objectDblPtr)->configMutex, sizeof(EB_HANDLE), EB_MUTEX); - + return EB_ErrorNone; -} - +} + extern EB_ERRORTYPE LcuParamsCtor( - SequenceControlSet_t *sequenceControlSetPtr) { + SequenceControlSet_t *sequenceControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_MALLOC(LcuParams_t*, sequenceControlSetPtr->lcuParamsArray, sizeof(LcuParams_t) * ((MAX_PICTURE_WIDTH_SIZE + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize) * ((MAX_PICTURE_HEIGHT_SIZE + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize), EB_N_PTR); - return return_error; + EB_MALLOC(LcuParams_t*, sequenceControlSetPtr->lcuParamsArray, sizeof(LcuParams_t) * ((MAX_PICTURE_WIDTH_SIZE + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize) * ((MAX_PICTURE_HEIGHT_SIZE + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize), EB_N_PTR); + return return_error; } extern EB_ERRORTYPE LcuParamsInit( - SequenceControlSet_t *sequenceControlSetPtr) { + SequenceControlSet_t *sequenceControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U16 lcuIndex; - EB_U16 rasterScanCuIndex; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U16 lcuIndex; + EB_U16 rasterScanCuIndex; - EB_U8 pictureLcuWidth = sequenceControlSetPtr->pictureWidthInLcu; - EB_U8 pictureLcuHeight = sequenceControlSetPtr->pictureHeightInLcu; - EB_MALLOC(LcuParams_t*, sequenceControlSetPtr->lcuParamsArray, sizeof(LcuParams_t) * pictureLcuWidth * pictureLcuHeight, EB_N_PTR); + EB_U8 pictureLcuWidth = sequenceControlSetPtr->pictureWidthInLcu; + EB_U8 pictureLcuHeight = sequenceControlSetPtr->pictureHeightInLcu; + EB_MALLOC(LcuParams_t*, sequenceControlSetPtr->lcuParamsArray, sizeof(LcuParams_t) * pictureLcuWidth * pictureLcuHeight, EB_N_PTR); - for (lcuIndex = 0; lcuIndex < pictureLcuWidth * pictureLcuHeight; ++lcuIndex) { - sequenceControlSetPtr->lcuParamsArray[lcuIndex].horizontalIndex = (EB_U8)(lcuIndex % pictureLcuWidth); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex = (EB_U8)(lcuIndex / pictureLcuWidth); + for (lcuIndex = 0; lcuIndex < pictureLcuWidth * pictureLcuHeight; ++lcuIndex) { + sequenceControlSetPtr->lcuParamsArray[lcuIndex].horizontalIndex = (EB_U8)(lcuIndex % pictureLcuWidth); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex = (EB_U8)(lcuIndex / pictureLcuWidth); sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX = sequenceControlSetPtr->lcuParamsArray[lcuIndex].horizontalIndex * sequenceControlSetPtr->lcuSize; - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY = sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex * sequenceControlSetPtr->lcuSize; + sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY = sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex * sequenceControlSetPtr->lcuSize; - sequenceControlSetPtr->lcuParamsArray[lcuIndex].width = (EB_U8)(((sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX) < sequenceControlSetPtr->lcuSize) ? - sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX : - sequenceControlSetPtr->lcuSize); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].width = (EB_U8)(((sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX) < sequenceControlSetPtr->lcuSize) ? + sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX : + sequenceControlSetPtr->lcuSize); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].height = (EB_U8)(((sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY) < sequenceControlSetPtr->lcuSize) ? - sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY : - sequenceControlSetPtr->lcuSize); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].height = (EB_U8)(((sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY) < sequenceControlSetPtr->lcuSize) ? + sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY : + sequenceControlSetPtr->lcuSize); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].isCompleteLcu = (EB_U8)(((sequenceControlSetPtr->lcuParamsArray[lcuIndex].width == sequenceControlSetPtr->lcuSize) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].height == sequenceControlSetPtr->lcuSize)) ? - 1 : - 0); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].isCompleteLcu = (EB_U8)(((sequenceControlSetPtr->lcuParamsArray[lcuIndex].width == sequenceControlSetPtr->lcuSize) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].height == sequenceControlSetPtr->lcuSize)) ? + 1 : + 0); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].isEdgeLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX < sequenceControlSetPtr->lcuSize) || - (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < sequenceControlSetPtr->lcuSize) || - (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX > sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuSize) || - (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY > sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuSize) ? 1 : 0; + sequenceControlSetPtr->lcuParamsArray[lcuIndex].isEdgeLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX < sequenceControlSetPtr->lcuSize) || + (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < sequenceControlSetPtr->lcuSize) || + (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX > sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuSize) || + (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY > sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuSize) ? 1 : 0; EB_U8 potentialLogoLcu = 0; @@ -280,38 +280,38 @@ extern EB_ERRORTYPE LcuParamsInit( // 4K /*__ 14 __ __ 14__*/ /////////////////////////// - // | | // - // 8 8 // - //___14_ | |_14___// - // // - // // + // | | // + // 8 8 // + //___14_ | |_14___// + // // + // // //-----------------------// | - // // 8 - /////////////////////////// | + // // 8 + /////////////////////////// | // 1080p/720P /*__ 7 __ __ 7__*/ /////////////////////////// - // | | // - // 4 4 // - //___7__ | |__7___// - // // - // // + // | | // + // 4 4 // + //___7__ | |__7___// + // // + // // //-----------------------// | - // // 4 - /////////////////////////// | + // // 4 + /////////////////////////// | // 480P /*__ 3 __ __ 3__*/ /////////////////////////// - // | | // - // 2 2 // - //___3__ | |__3___// - // // - // // + // | | // + // 2 2 // + //___3__ | |__3___// + // // + // // //-----------------------// | - // // 2 - /////////////////////////// | + // // 2 + /////////////////////////// | if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER){ potentialLogoLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX >= (sequenceControlSetPtr->lumaWidth - (3 * sequenceControlSetPtr->lcuSize))) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < 2 * sequenceControlSetPtr->lcuSize) ? 1 : potentialLogoLcu; potentialLogoLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX < ((3 * sequenceControlSetPtr->lcuSize))) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < 2 * sequenceControlSetPtr->lcuSize) ? 1 : potentialLogoLcu; @@ -334,32 +334,32 @@ extern EB_ERRORTYPE LcuParamsInit( } sequenceControlSetPtr->lcuParamsArray[lcuIndex].potentialLogoLcu = potentialLogoLcu; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_8x8_63; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_8x8_63; rasterScanCuIndex++) { - sequenceControlSetPtr->lcuParamsArray[lcuIndex].rasterScanCuValidity[rasterScanCuIndex] = ((sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX + RASTER_SCAN_CU_X[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaWidth ) || (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY + RASTER_SCAN_CU_Y[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaHeight)) ? - EB_FALSE : - EB_TRUE; - } - } + sequenceControlSetPtr->lcuParamsArray[lcuIndex].rasterScanCuValidity[rasterScanCuIndex] = ((sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX + RASTER_SCAN_CU_X[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaWidth ) || (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY + RASTER_SCAN_CU_Y[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaHeight)) ? + EB_FALSE : + EB_TRUE; + } + } //ConfigureTiles(sequenceControlSetPtr); - return return_error; + return return_error; } extern EB_ERRORTYPE DeriveInputResolution( - SequenceControlSet_t *sequenceControlSetPtr, - EB_U32 inputSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - sequenceControlSetPtr->inputResolution = (inputSize < INPUT_SIZE_1080i_TH) ? - INPUT_SIZE_576p_RANGE_OR_LOWER : - (inputSize < INPUT_SIZE_1080p_TH) ? - INPUT_SIZE_1080i_RANGE : - (inputSize < INPUT_SIZE_4K_TH) ? - INPUT_SIZE_1080p_RANGE : - INPUT_SIZE_4K_RANGE; - - return return_error; + SequenceControlSet_t *sequenceControlSetPtr, + EB_U32 inputSize) { + EB_ERRORTYPE return_error = EB_ErrorNone; + + sequenceControlSetPtr->inputResolution = (inputSize < INPUT_SIZE_1080i_TH) ? + INPUT_SIZE_576p_RANGE_OR_LOWER : + (inputSize < INPUT_SIZE_1080p_TH) ? + INPUT_SIZE_1080i_RANGE : + (inputSize < INPUT_SIZE_4K_TH) ? + INPUT_SIZE_1080p_RANGE : + INPUT_SIZE_4K_RANGE; + + return return_error; } diff --git a/Source/Lib/Codec/EbSequenceControlSet.h b/Source/Lib/Codec/EbSequenceControlSet.h index 8d85186be..f3cefab4b 100644 --- a/Source/Lib/Codec/EbSequenceControlSet.h +++ b/Source/Lib/Codec/EbSequenceControlSet.h @@ -27,7 +27,7 @@ typedef struct SequenceControlSet_s // Encoding Context EncodeContext_t *encodeContextPtr; - + // Profile & ID EB_U32 spsId; EB_U32 vpsId; @@ -43,7 +43,7 @@ typedef struct SequenceControlSet_s EB_U16 maxInputLumaWidth; EB_U16 maxInputLumaHeight; //EB_U16 maxInputChromaWidth; - //EB_U16 maxInputChromaHeight; + //EB_U16 maxInputChromaHeight; EB_U16 maxInputPadRight; EB_U16 maxInputPadBottom; EB_U16 lumaWidth; @@ -57,50 +57,50 @@ typedef struct SequenceControlSet_s EB_U16 rightPadding; EB_U16 botPadding; - EB_U32 frameRate; + EB_U32 frameRate; EB_U32 encoderBitDepth; // Cropping Definitions EB_S32 croppingLeftOffset; EB_S32 croppingRightOffset; EB_S32 croppingTopOffset; - EB_S32 croppingBottomOffset; + EB_S32 croppingBottomOffset; // Conformance Window flag EB_U32 conformanceWindowFlag; - + // Bitdepth EB_BITDEPTH inputBitdepth; EB_BITDEPTH outputBitdepth; - + // Group of Pictures (GOP) Structure EB_U32 maxRefCount; // Maximum number of reference pictures, however each pred // entry can be less. - PredictionStructure_t *predStructPtr; + PredictionStructure_t *predStructPtr; EB_S32 intraPeriodLength; // The frequency of intra pictures EB_S32 intraRefreshType; // -1: CRA, >=0: IDR - + // LCU EB_U8 lcuSize; EB_U8 maxLcuDepth; - // Interlaced Video + // Interlaced Video EB_BOOL interlacedVideo; EB_U32 generalProgressiveSourceFlag; EB_U32 generalInterlacedSourceFlag; EB_U32 generalFrameOnlyConstraintFlag; - + // Rate Control EB_U32 rateControlMode; EB_U32 targetBitrate; - EB_U32 availableBandwidth; - + EB_U32 availableBandwidth; + // Quantization EB_U32 qp; EB_BOOL enableQpScalingFlag; - - // tmvp enable + + // tmvp enable EB_U32 enableTmvpSps; // Strong Intra Smoothing @@ -114,7 +114,7 @@ typedef struct SequenceControlSet_s // Video Usability Info AppVideoUsabilityInfo_t *videoUsabilityInfoPtr; - + // Picture timing sei AppPictureTimingSei_t picTimingSei; @@ -138,7 +138,7 @@ typedef struct SequenceControlSet_s // Maximum Decoded Picture Buffer size. EB_U32 maxDpbSize; - + // Picture Analysis EB_U32 pictureAnalysisNumberOfRegionsPerWidth; EB_U32 pictureAnalysisNumberOfRegionsPerHeight; @@ -153,28 +153,28 @@ typedef struct SequenceControlSet_s EB_U32 encDecSegmentRowCountArray[MAX_TEMPORAL_LAYERS]; // Buffers - EB_U32 pictureControlSetPoolInitCount; - EB_U32 pictureControlSetPoolInitCountChild; + EB_U32 pictureControlSetPoolInitCount; + EB_U32 pictureControlSetPoolInitCountChild; EB_U32 paReferencePictureBufferInitCount; EB_U32 referencePictureBufferInitCount; EB_U32 reconBufferFifoInitCount; EB_U32 inputOutputBufferFifoInitCount; - EB_U32 resourceCoordinationFifoInitCount; + EB_U32 resourceCoordinationFifoInitCount; EB_U32 pictureAnalysisFifoInitCount; EB_U32 pictureDecisionFifoInitCount; EB_U32 motionEstimationFifoInitCount; EB_U32 initialRateControlFifoInitCount; - EB_U32 pictureDemuxFifoInitCount; - EB_U32 rateControlTasksFifoInitCount; - EB_U32 rateControlFifoInitCount; + EB_U32 pictureDemuxFifoInitCount; + EB_U32 rateControlTasksFifoInitCount; + EB_U32 rateControlFifoInitCount; EB_U32 modeDecisionConfigurationFifoInitCount; - //EB_U32 modeDecisionFifoInitCount; + //EB_U32 modeDecisionFifoInitCount; EB_U32 encDecFifoInitCount; EB_U32 entropyCodingFifoInitCount; - EB_U32 pictureAnalysisProcessInitCount; - EB_U32 motionEstimationProcessInitCount; + EB_U32 pictureAnalysisProcessInitCount; + EB_U32 motionEstimationProcessInitCount; EB_U32 sourceBasedOperationsProcessInitCount; - EB_U32 modeDecisionConfigurationProcessInitCount; + EB_U32 modeDecisionConfigurationProcessInitCount; EB_U32 encDecProcessInitCount; EB_U32 entropyCodingProcessInitCount; @@ -204,29 +204,29 @@ typedef struct EbSequenceControlSetInitData_s } EbSequenceControlSetInitData_t; typedef struct EbSequenceControlSetInstance_s -{ +{ EncodeContext_t *encodeContextPtr; SequenceControlSet_t *sequenceControlSetPtr; EB_HANDLE configMutex; - + } EbSequenceControlSetInstance_t; /************************************** * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EbSequenceControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + extern EB_ERRORTYPE CopySequenceControlSet( SequenceControlSet_t *dst, SequenceControlSet_t *src); - + extern EB_ERRORTYPE EbSequenceControlSetInstanceCtor( EbSequenceControlSetInstance_t **objectDblPtr); - + extern EB_ERRORTYPE LcuParamsCtor( @@ -240,5 +240,5 @@ extern EB_ERRORTYPE DeriveInputResolution( #ifdef __cplusplus } -#endif +#endif #endif // EbSequenceControlSet_h diff --git a/Source/Lib/Codec/EbSourceBasedOperationsProcess.c b/Source/Lib/Codec/EbSourceBasedOperationsProcess.c index a1b0d24e5..c3437f426 100644 --- a/Source/Lib/Codec/EbSourceBasedOperationsProcess.c +++ b/Source/Lib/Codec/EbSourceBasedOperationsProcess.c @@ -25,7 +25,7 @@ #define PAN_LCU_PERCENTAGE 75 #define LOW_AMPLITUDE_TH 16 -#define Y_MEAN_RANGE_03 52 +#define Y_MEAN_RANGE_03 52 #define Y_MEAN_RANGE_02 70 #define Y_MEAN_RANGE_01 130 #define CB_MEAN_RANGE_02 115 @@ -33,30 +33,30 @@ #define CR_MEAN_RANGE_02 135 #define DARK_FRM_TH 45 -#define CB_MEAN_RANGE_00 80 +#define CB_MEAN_RANGE_00 80 #define SAD_DEVIATION_LCU_TH_0 15 #define SAD_DEVIATION_LCU_TH_1 20 -#define MAX_DELTA_QP_SHAPE_TH 4 +#define MAX_DELTA_QP_SHAPE_TH 4 #define MIN_DELTA_QP_SHAPE_TH 1 #define MIN_BLACK_AREA_PERCENTAGE 20 -#define LOW_MEAN_TH_0 25 +#define LOW_MEAN_TH_0 25 #define MIN_WHITE_AREA_PERCENTAGE 1 -#define LOW_MEAN_TH_1 40 +#define LOW_MEAN_TH_1 40 #define HIGH_MEAN_TH 210 #define NORM_FACTOR 10 // Used ComplexityClassifier32x32 const EB_U32 THRESHOLD_NOISE[MAX_TEMPORAL_LAYERS] = { 33, 28, 27, 26, 26, 26 }; // [Temporal Layer Index] // Used ComplexityClassifier32x32 // Outlier removal threshold per depth {2%, 2%, 4%, 4%} const EB_S8 MinDeltaQPdefault[3] = { - -4, -3, -2 + -4, -3, -2 }; const EB_U8 MaxDeltaQPdefault[3] = { - 4, 5, 6 + 4, 5, 6 }; /************************************************ @@ -65,17 +65,17 @@ const EB_U8 MaxDeltaQPdefault[3] = { EB_ERRORTYPE SourceBasedOperationsContextCtor( SourceBasedOperationsContext_t **contextDblPtr, - EbFifo_t *initialRateControlResultsInputFifoPtr, - EbFifo_t *pictureDemuxResultsOutputFifoPtr) + EbFifo_t *initialRateControlResultsInputFifoPtr, + EbFifo_t *pictureDemuxResultsOutputFifoPtr) { - SourceBasedOperationsContext_t *contextPtr; + SourceBasedOperationsContext_t *contextPtr; - EB_MALLOC(SourceBasedOperationsContext_t*, contextPtr, sizeof(SourceBasedOperationsContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; - contextPtr->initialrateControlResultsInputFifoPtr = initialRateControlResultsInputFifoPtr; - contextPtr->pictureDemuxResultsOutputFifoPtr = pictureDemuxResultsOutputFifoPtr; + EB_MALLOC(SourceBasedOperationsContext_t*, contextPtr, sizeof(SourceBasedOperationsContext_t), EB_N_PTR); + *contextDblPtr = contextPtr; + contextPtr->initialrateControlResultsInputFifoPtr = initialRateControlResultsInputFifoPtr; + contextPtr->pictureDemuxResultsOutputFifoPtr = pictureDemuxResultsOutputFifoPtr; - return EB_ErrorNone; + return EB_ErrorNone; } /*************************************************** @@ -83,13 +83,13 @@ EB_ERRORTYPE SourceBasedOperationsContextCtor( ***************************************************/ static void DerivePictureActivityStatistics( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U64 nonMovingIndexSum = 0; - - EB_U32 lcuIndex; + EB_U64 nonMovingIndexSum = 0; + + EB_U32 lcuIndex; EB_U32 zzSum = 0; EB_U32 completeLcuCount = 0; @@ -107,7 +107,7 @@ static void DerivePictureActivityStatistics( completeLcuCount++; } - } + } if (completeLcuCount > 0) { pictureControlSetPtr->nonMovingIndexAverage = (EB_U16)(nonMovingIndexSum / completeLcuCount); @@ -115,7 +115,7 @@ static void DerivePictureActivityStatistics( } pictureControlSetPtr->lowMotionContentFlag = pictureControlSetPtr->zzCostAverage == 0 ? EB_TRUE : EB_FALSE; - return; + return; } /*************************************************** @@ -171,9 +171,9 @@ static void ComplexityClassifier32x32( * Pre-MD Uncovered Area Detection ******************************************************/ static void FailingMotionLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { EB_U32 rasterScanCuIndex; @@ -194,23 +194,23 @@ static void FailingMotionLcu( // Get ME SAD - cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; + cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; - OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + - oisResultsPtr->sortedOisCandidate[2][0].distortion + - oisResultsPtr->sortedOisCandidate[3][0].distortion + - oisResultsPtr->sortedOisCandidate[4][0].distortion; - } - else { //32x32 - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; - } + OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + + oisResultsPtr->sortedOisCandidate[2][0].distortion + + oisResultsPtr->sortedOisCandidate[3][0].distortion + + oisResultsPtr->sortedOisCandidate[4][0].distortion; + } + else { //32x32 + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; + } + - EB_S64 meToOisSadDiff = (EB_S32)cuMeSAD - (EB_S32)sortedcuOisSAD; meToOisSadDeviation = (sortedcuOisSAD == 0) || (meToOisSadDiff < 0) ? 0 : (meToOisSadDiff * 100) / sortedcuOisSAD; @@ -230,73 +230,73 @@ static void FailingMotionLcu( * Pre-MD Uncovered Area Detection ******************************************************/ static void DetectUncoveredLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 rasterScanCuIndex; + EB_U32 rasterScanCuIndex; - // LCU Loop : Uncovered area detector -- ON only for 4k + // LCU Loop : Uncovered area detector -- ON only for 4k LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - // Detection variables - EB_U64 sortedcuOisSAD = 0; - EB_U64 cuMeSAD = 0; - EB_S64 meToOisSadDeviation = 0; - // LCU loop variables + // Detection variables + EB_U64 sortedcuOisSAD = 0; + EB_U64 cuMeSAD = 0; + EB_S64 meToOisSadDeviation = 0; + // LCU loop variables - EB_S64 uncoveredAreaLcuFlag = 0; + EB_S64 uncoveredAreaLcuFlag = 0; - if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ + if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ if (lcuParams->isCompleteLcu && (!pictureControlSetPtr->similarColocatedLcuArray[lcuIndex])){ - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_32x32_3; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_32x32_3; rasterScanCuIndex++) { + + meToOisSadDeviation = 0; - meToOisSadDeviation = 0; + // Get ME SAD - // Get ME SAD + cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; - cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; + OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + + oisResultsPtr->sortedOisCandidate[2][0].distortion + + oisResultsPtr->sortedOisCandidate[3][0].distortion + + oisResultsPtr->sortedOisCandidate[4][0].distortion; + } + else if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] == 32) { + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; + } + else { + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; + } - OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + - oisResultsPtr->sortedOisCandidate[2][0].distortion + - oisResultsPtr->sortedOisCandidate[3][0].distortion + - oisResultsPtr->sortedOisCandidate[4][0].distortion; - } - else if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] == 32) { - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; - } - else { - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; - } - - EB_S64 meToOisSadDiff = (EB_S32)cuMeSAD - (EB_S32)sortedcuOisSAD; - meToOisSadDeviation = (sortedcuOisSAD == 0) || (meToOisSadDiff < 0) ? 0 : (meToOisSadDiff * 100) / sortedcuOisSAD; + EB_S64 meToOisSadDiff = (EB_S32)cuMeSAD - (EB_S32)sortedcuOisSAD; + meToOisSadDeviation = (sortedcuOisSAD == 0) || (meToOisSadDiff < 0) ? 0 : (meToOisSadDiff * 100) / sortedcuOisSAD; - if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 16){ + if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 16){ if (meToOisSadDeviation > SAD_DEVIATION_LCU_TH_1){ - uncoveredAreaLcuFlag += 1; - } + uncoveredAreaLcuFlag += 1; + } - } - } + } + } - // Update Uncovered area flag - pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = uncoveredAreaLcuFlag ? EB_TRUE : EB_FALSE; - } + // Update Uncovered area flag + pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = uncoveredAreaLcuFlag ? EB_TRUE : EB_FALSE; + } - } + } } @@ -304,379 +304,379 @@ static void DetectUncoveredLcu( * Calculates AC Energy ******************************************************/ static void CalculateAcEnergy( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EB_U32 inputLumaStride = inputPicturePtr->strideY; - EB_U32 inputOriginIndex; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EB_U32 inputLumaStride = inputPicturePtr->strideY; + EB_U32 inputOriginIndex; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - EB_U8 *meanPtr = pictureControlSetPtr->yMean[lcuIndex]; - inputOriginIndex = (lcuParams->originY + inputPicturePtr->originY) * inputLumaStride + (lcuParams->originX + inputPicturePtr->originX); - - if (lcuParams->isCompleteLcu && pictureControlSetPtr->sliceType == EB_I_PICTURE){ - - EB_U32 inputCuOriginIndex; - EB_U32 cuNum, cuSize; - EB_U16 cuH, cuW; - - - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = ComputeNxMSatdSadLCU( - &(inputPicturePtr->bufferY[inputOriginIndex]), - inputPicturePtr->strideY, - lcuParams->width, - lcuParams->height); - - //64 x 64 - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = meanPtr[0]; - - // 32x32 - cuSize = 32; - cuNum = 64 / cuSize; - for (cuH = 0; cuH < cuNum; cuH++){ - for (cuW = 0; cuW < cuNum; cuW++){ - inputCuOriginIndex = inputOriginIndex + cuH*(64 / cuNum)*inputLumaStride + cuW*(64 / cuNum); - - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1 + cuH*cuNum + cuW] = ComputeNxMSatdSadLCU( - &(inputPicturePtr->bufferY[inputCuOriginIndex]), - inputPicturePtr->strideY, - cuSize, - cuSize); - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1 + cuH*cuNum + cuW] = meanPtr[1 + cuH*cuNum + cuW]; - } - } - - - } - else{ - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][2] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][3] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][4] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][2] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][3] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][4] = 100000000; - } + EB_U8 *meanPtr = pictureControlSetPtr->yMean[lcuIndex]; + inputOriginIndex = (lcuParams->originY + inputPicturePtr->originY) * inputLumaStride + (lcuParams->originX + inputPicturePtr->originX); + + if (lcuParams->isCompleteLcu && pictureControlSetPtr->sliceType == EB_I_PICTURE){ + + EB_U32 inputCuOriginIndex; + EB_U32 cuNum, cuSize; + EB_U16 cuH, cuW; + + + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = ComputeNxMSatdSadLCU( + &(inputPicturePtr->bufferY[inputOriginIndex]), + inputPicturePtr->strideY, + lcuParams->width, + lcuParams->height); + + //64 x 64 + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = meanPtr[0]; + + // 32x32 + cuSize = 32; + cuNum = 64 / cuSize; + for (cuH = 0; cuH < cuNum; cuH++){ + for (cuW = 0; cuW < cuNum; cuW++){ + inputCuOriginIndex = inputOriginIndex + cuH*(64 / cuNum)*inputLumaStride + cuW*(64 / cuNum); + + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1 + cuH*cuNum + cuW] = ComputeNxMSatdSadLCU( + &(inputPicturePtr->bufferY[inputCuOriginIndex]), + inputPicturePtr->strideY, + cuSize, + cuSize); + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1 + cuH*cuNum + cuW] = meanPtr[1 + cuH*cuNum + cuW]; + } + } + + + } + else{ + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][2] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][3] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][4] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][2] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][3] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][4] = 100000000; + } } static void LumaContrastDetectorLcu( - SourceBasedOperationsContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SourceBasedOperationsContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U64 cuOisSAD = 0; - EB_U64 cuMeSAD = 0; + EB_U64 cuOisSAD = 0; + EB_U64 cuMeSAD = 0; - // Calculate Luma mean of the frame by averaging the mean of LCUs to Detect Dark Frames (On only for 4k and BQMode) - EB_U8 *yMeanPtr = contextPtr->yMeanPtr; + // Calculate Luma mean of the frame by averaging the mean of LCUs to Detect Dark Frames (On only for 4k and BQMode) + EB_U8 *yMeanPtr = contextPtr->yMeanPtr; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->isCompleteLcu){ - if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0) { + if (lcuParams->isCompleteLcu){ + if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0) { - OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - cuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + - oisResultsPtr->sortedOisCandidate[2][0].distortion + - oisResultsPtr->sortedOisCandidate[3][0].distortion + - oisResultsPtr->sortedOisCandidate[4][0].distortion; + OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + cuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + + oisResultsPtr->sortedOisCandidate[2][0].distortion + + oisResultsPtr->sortedOisCandidate[3][0].distortion + + oisResultsPtr->sortedOisCandidate[4][0].distortion; - cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][0].distortionDirection[0].distortion; + cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][0].distortionDirection[0].distortion; - contextPtr->toBeIntraCodedProbability += cuOisSAD < cuMeSAD ? 1 : 0; - contextPtr->depth1BlockNum++; - } - } + contextPtr->toBeIntraCodedProbability += cuOisSAD < cuMeSAD ? 1 : 0; + contextPtr->depth1BlockNum++; + } + } - if (pictureControlSetPtr->nonMovingIndexArray[lcuIndex] < 10) - { - contextPtr->yNonMovingMean += yMeanPtr[0]; - contextPtr->countOfNonMovingLcus++; - } - else { - contextPtr->yMovingMean += yMeanPtr[0]; - contextPtr->countOfMovingLcus++; - } + if (pictureControlSetPtr->nonMovingIndexArray[lcuIndex] < 10) + { + contextPtr->yNonMovingMean += yMeanPtr[0]; + contextPtr->countOfNonMovingLcus++; + } + else { + contextPtr->yMovingMean += yMeanPtr[0]; + contextPtr->countOfMovingLcus++; + } } static void LumaContrastDetectorPicture( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr) { + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - contextPtr->yNonMovingMean = (contextPtr->countOfNonMovingLcus != 0) ? (contextPtr->yNonMovingMean / contextPtr->countOfNonMovingLcus) : 0; - contextPtr->yMovingMean = (contextPtr->countOfMovingLcus != 0) ? (contextPtr->yMovingMean / contextPtr->countOfMovingLcus) : 0; + contextPtr->yNonMovingMean = (contextPtr->countOfNonMovingLcus != 0) ? (contextPtr->yNonMovingMean / contextPtr->countOfNonMovingLcus) : 0; + contextPtr->yMovingMean = (contextPtr->countOfMovingLcus != 0) ? (contextPtr->yMovingMean / contextPtr->countOfMovingLcus) : 0; - pictureControlSetPtr->darkBackGroundlightForeGround = ((contextPtr->yMovingMean > (2 * contextPtr->yNonMovingMean)) && (contextPtr->yNonMovingMean < DARK_FRM_TH)) ? - EB_TRUE : - EB_FALSE; + pictureControlSetPtr->darkBackGroundlightForeGround = ((contextPtr->yMovingMean > (2 * contextPtr->yNonMovingMean)) && (contextPtr->yNonMovingMean < DARK_FRM_TH)) ? + EB_TRUE : + EB_FALSE; - pictureControlSetPtr->intraCodedBlockProbability = 0; + pictureControlSetPtr->intraCodedBlockProbability = 0; - if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0){ - pictureControlSetPtr->intraCodedBlockProbability = (EB_U8)(contextPtr->depth1BlockNum != 0 ? contextPtr->toBeIntraCodedProbability * 100 / contextPtr->depth1BlockNum : 0); - } + if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0){ + pictureControlSetPtr->intraCodedBlockProbability = (EB_U8)(contextPtr->depth1BlockNum != 0 ? contextPtr->toBeIntraCodedProbability * 100 / contextPtr->depth1BlockNum : 0); + } } static void GrassSkinLcu( - SourceBasedOperationsContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SourceBasedOperationsContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 childIndex; + EB_U32 childIndex; - EB_BOOL lcuGrassFlag = EB_FALSE; + EB_BOOL lcuGrassFlag = EB_FALSE; - EB_U32 grassLcuInrange; - EB_U32 processedCus; - EB_U32 rasterScanCuIndex; + EB_U32 grassLcuInrange; + EB_U32 processedCus; + EB_U32 rasterScanCuIndex; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->lcuStatArray[lcuIndex]); + LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->lcuStatArray[lcuIndex]); - _mm_prefetch((const char*)lcuStatPtr, _MM_HINT_T0); + _mm_prefetch((const char*)lcuStatPtr, _MM_HINT_T0); - lcuGrassFlag = EB_FALSE; - grassLcuInrange = 0; - processedCus = 0; + lcuGrassFlag = EB_FALSE; + grassLcuInrange = 0; + processedCus = 0; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { - const EB_U32 mdScanCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanCuIndex]; - const EB_U32 rasterScanParentCuIndex = RASTER_SCAN_CU_PARENT_INDEX[rasterScanCuIndex]; - const EB_U32 mdScanParentCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanParentCuIndex]; - CuStat_t *cuStatPtr = &(lcuStatPtr->cuStatArray[mdScanCuIndex]); + const EB_U32 mdScanCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanCuIndex]; + const EB_U32 rasterScanParentCuIndex = RASTER_SCAN_CU_PARENT_INDEX[rasterScanCuIndex]; + const EB_U32 mdScanParentCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanParentCuIndex]; + CuStat_t *cuStatPtr = &(lcuStatPtr->cuStatArray[mdScanCuIndex]); - const EB_U32 perfectCondition = 7; - const EB_U8 yMean = contextPtr->yMeanPtr[rasterScanCuIndex]; - const EB_U8 cbMean = contextPtr->cbMeanPtr[rasterScanCuIndex]; - const EB_U8 crMean = contextPtr->crMeanPtr[rasterScanCuIndex]; - EB_U32 grassCondition = 0; - EB_U32 skinCondition = 0; + const EB_U32 perfectCondition = 7; + const EB_U8 yMean = contextPtr->yMeanPtr[rasterScanCuIndex]; + const EB_U8 cbMean = contextPtr->cbMeanPtr[rasterScanCuIndex]; + const EB_U8 crMean = contextPtr->crMeanPtr[rasterScanCuIndex]; + EB_U32 grassCondition = 0; + EB_U32 skinCondition = 0; - EB_U32 highChromaCondition = 0; - EB_U32 highLumaCondition = 0; + EB_U32 highChromaCondition = 0; + EB_U32 highLumaCondition = 0; - // GRASS - grassCondition += (yMean > Y_MEAN_RANGE_02 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; - grassCondition += (cbMean > CB_MEAN_RANGE_00 && cbMean < CB_MEAN_RANGE_02) ? 2 : 0; - grassCondition += (crMean > CR_MEAN_RANGE_00 && crMean < CR_MEAN_RANGE_02) ? 4 : 0; + // GRASS + grassCondition += (yMean > Y_MEAN_RANGE_02 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; + grassCondition += (cbMean > CB_MEAN_RANGE_00 && cbMean < CB_MEAN_RANGE_02) ? 2 : 0; + grassCondition += (crMean > CR_MEAN_RANGE_00 && crMean < CR_MEAN_RANGE_02) ? 4 : 0; - grassLcuInrange += (grassCondition == perfectCondition) ? 1 : 0; - processedCus++; + grassLcuInrange += (grassCondition == perfectCondition) ? 1 : 0; + processedCus++; - lcuGrassFlag = grassCondition == perfectCondition ? EB_TRUE : lcuGrassFlag; + lcuGrassFlag = grassCondition == perfectCondition ? EB_TRUE : lcuGrassFlag; - cuStatPtr->grassArea = (EB_BOOL)(grassCondition == perfectCondition); - // SKIN - skinCondition += (yMean > Y_MEAN_RANGE_03 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; - skinCondition += (cbMean > 100 && cbMean < 120) ? 2 : 0; - skinCondition += (crMean > 135 && crMean < 160) ? 4 : 0; + cuStatPtr->grassArea = (EB_BOOL)(grassCondition == perfectCondition); + // SKIN + skinCondition += (yMean > Y_MEAN_RANGE_03 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; + skinCondition += (cbMean > 100 && cbMean < 120) ? 2 : 0; + skinCondition += (crMean > 135 && crMean < 160) ? 4 : 0; - cuStatPtr->skinArea = (EB_BOOL)(skinCondition == perfectCondition); + cuStatPtr->skinArea = (EB_BOOL)(skinCondition == perfectCondition); - highChromaCondition = (crMean >= 127 || cbMean > 150) ? 1 : 0; - highLumaCondition = (crMean >= 80 && yMean > 180) ? 1 : 0; - cuStatPtr->highLuma = (highLumaCondition == 1) ? EB_TRUE : EB_FALSE; - cuStatPtr->highChroma = (highChromaCondition == 1) ? EB_TRUE : EB_FALSE; + highChromaCondition = (crMean >= 127 || cbMean > 150) ? 1 : 0; + highLumaCondition = (crMean >= 80 && yMean > 180) ? 1 : 0; + cuStatPtr->highLuma = (highLumaCondition == 1) ? EB_TRUE : EB_FALSE; + cuStatPtr->highChroma = (highChromaCondition == 1) ? EB_TRUE : EB_FALSE; - for (childIndex = mdScanCuIndex + 1; childIndex < mdScanCuIndex + 5; ++childIndex){ - lcuStatPtr->cuStatArray[childIndex].grassArea = cuStatPtr->grassArea; - lcuStatPtr->cuStatArray[childIndex].skinArea = cuStatPtr->skinArea; - lcuStatPtr->cuStatArray[childIndex].highChroma = cuStatPtr->highChroma; - lcuStatPtr->cuStatArray[childIndex].highLuma = cuStatPtr->highLuma; + for (childIndex = mdScanCuIndex + 1; childIndex < mdScanCuIndex + 5; ++childIndex){ + lcuStatPtr->cuStatArray[childIndex].grassArea = cuStatPtr->grassArea; + lcuStatPtr->cuStatArray[childIndex].skinArea = cuStatPtr->skinArea; + lcuStatPtr->cuStatArray[childIndex].highChroma = cuStatPtr->highChroma; + lcuStatPtr->cuStatArray[childIndex].highLuma = cuStatPtr->highLuma; - } + } - lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea = cuStatPtr->grassArea ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea; - lcuStatPtr->cuStatArray[0].grassArea = cuStatPtr->grassArea ? EB_TRUE : - lcuStatPtr->cuStatArray[0].grassArea; - lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea = cuStatPtr->skinArea ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea; - lcuStatPtr->cuStatArray[0].skinArea = cuStatPtr->skinArea ? EB_TRUE : - lcuStatPtr->cuStatArray[0].skinArea; - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma = cuStatPtr->highChroma ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma; - lcuStatPtr->cuStatArray[0].highChroma = cuStatPtr->highChroma ? EB_TRUE : - lcuStatPtr->cuStatArray[0].highChroma; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea = cuStatPtr->grassArea ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea; + lcuStatPtr->cuStatArray[0].grassArea = cuStatPtr->grassArea ? EB_TRUE : + lcuStatPtr->cuStatArray[0].grassArea; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea = cuStatPtr->skinArea ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea; + lcuStatPtr->cuStatArray[0].skinArea = cuStatPtr->skinArea ? EB_TRUE : + lcuStatPtr->cuStatArray[0].skinArea; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma = cuStatPtr->highChroma ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma; + lcuStatPtr->cuStatArray[0].highChroma = cuStatPtr->highChroma ? EB_TRUE : + lcuStatPtr->cuStatArray[0].highChroma; - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma = cuStatPtr->highLuma ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma; - lcuStatPtr->cuStatArray[0].highLuma = cuStatPtr->highLuma ? EB_TRUE : - lcuStatPtr->cuStatArray[0].highLuma; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma = cuStatPtr->highLuma ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma; + lcuStatPtr->cuStatArray[0].highLuma = cuStatPtr->highLuma ? EB_TRUE : + lcuStatPtr->cuStatArray[0].highLuma; - } - } + } + } - contextPtr->pictureNumGrassLcu += lcuGrassFlag ? 1 : 0; + contextPtr->pictureNumGrassLcu += lcuGrassFlag ? 1 : 0; } static void GrassSkinPicture( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr) { - pictureControlSetPtr->grassPercentageInPicture = (EB_U8)(contextPtr->pictureNumGrassLcu * 100 / pictureControlSetPtr->lcuTotalCount); + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { + pictureControlSetPtr->grassPercentageInPicture = (EB_U8)(contextPtr->pictureNumGrassLcu * 100 / pictureControlSetPtr->lcuTotalCount); } /****************************************************** * Detect and mark LCU and 32x32 CUs which belong to an isolated non-homogeneous region surrounding a homogenous and flat region ******************************************************/ static inline void DetermineIsolatedNonHomogeneousRegionInPicture( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U32 lcuIndex; - EB_U32 cuuIndex; - EB_S32 lcuHor, lcuVer, lcuVerOffset; - EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; - EB_U32 pictureWidthInLcu = sequenceControlSetPtr->pictureWidthInLcu; - EB_U32 pictureHeightInLcu = sequenceControlSetPtr->pictureHeightInLcu; + EB_U32 lcuIndex; + EB_U32 cuuIndex; + EB_S32 lcuHor, lcuVer, lcuVerOffset; + EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; + EB_U32 pictureWidthInLcu = sequenceControlSetPtr->pictureWidthInLcu; + EB_U32 pictureHeightInLcu = sequenceControlSetPtr->pictureHeightInLcu; - for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { + for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - // Initialize - pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_FALSE; + // Initialize + pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_FALSE; if ((lcuParams->horizontalIndex > 0) && (lcuParams->horizontalIndex < pictureWidthInLcu - 1) && (lcuParams->verticalIndex > 0) && (lcuParams->verticalIndex < pictureHeightInLcu - 1)) { - EB_U32 countOfMedVarianceLcu; - countOfMedVarianceLcu = 0; + EB_U32 countOfMedVarianceLcu; + countOfMedVarianceLcu = 0; // top neighbors - countOfMedVarianceLcu += ((pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64]) <= MEDIUM_LCU_VARIANCE) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex - pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; - // bottom - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu - 1].isCompleteLcu) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu].isCompleteLcu) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; - // left right - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + 1].isCompleteLcu) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; - - // At least two neighbors are flat - if ((countOfMedVarianceLcu > 2)|| countOfMedVarianceLcu > 1) - { - // Search within an LCU if any of the 32x32 CUs is non-homogeneous - EB_U32 count32x32NonhomCusInLcu = 0; - for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) - { - if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) - count32x32NonhomCusInLcu++; - } - // If atleast one is non-homogeneous, then check all its neighbors (top left, top, top right, left, right, btm left, btm, btm right) - EB_U32 countOfHomogeneousNeighborLcus = 0; - if (count32x32NonhomCusInLcu > 0) { - for (lcuVer = -1; lcuVer <= 1; lcuVer++) { - lcuVerOffset = lcuVer * (EB_S32)pictureWidthInLcu; - for (lcuHor = -1; lcuHor <= 1; lcuHor++) { - if (lcuVer != 0 && lcuHor != 0) - countOfHomogeneousNeighborLcus += (pictureControlSetPtr->lcuHomogeneousAreaArray[lcuIndex + lcuVerOffset + lcuHor] == EB_TRUE); - - } - } - } - - // To determine current lcu is isolated non-homogeneous, at least 2 neighbors must be homogeneous - if (countOfHomogeneousNeighborLcus >= 2){ - for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) - { - if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) - { - pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_TRUE; - } - } - } - - } - } - } - return; + countOfMedVarianceLcu += ((pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64]) <= MEDIUM_LCU_VARIANCE) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex - pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; + // bottom + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu - 1].isCompleteLcu) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu].isCompleteLcu) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; + // left right + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + 1].isCompleteLcu) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; + + // At least two neighbors are flat + if ((countOfMedVarianceLcu > 2)|| countOfMedVarianceLcu > 1) + { + // Search within an LCU if any of the 32x32 CUs is non-homogeneous + EB_U32 count32x32NonhomCusInLcu = 0; + for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) + { + if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) + count32x32NonhomCusInLcu++; + } + // If atleast one is non-homogeneous, then check all its neighbors (top left, top, top right, left, right, btm left, btm, btm right) + EB_U32 countOfHomogeneousNeighborLcus = 0; + if (count32x32NonhomCusInLcu > 0) { + for (lcuVer = -1; lcuVer <= 1; lcuVer++) { + lcuVerOffset = lcuVer * (EB_S32)pictureWidthInLcu; + for (lcuHor = -1; lcuHor <= 1; lcuHor++) { + if (lcuVer != 0 && lcuHor != 0) + countOfHomogeneousNeighborLcus += (pictureControlSetPtr->lcuHomogeneousAreaArray[lcuIndex + lcuVerOffset + lcuHor] == EB_TRUE); + + } + } + } + + // To determine current lcu is isolated non-homogeneous, at least 2 neighbors must be homogeneous + if (countOfHomogeneousNeighborLcus >= 2){ + for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) + { + if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) + { + pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_TRUE; + } + } + } + + } + } + } + return; } static void SetDefaultDeltaQpRange( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr) { - - EB_S8 minDeltaQP; - EB_U8 maxDeltaQP; - if (pictureControlSetPtr->temporalLayerIndex == 0) { - minDeltaQP = MinDeltaQPdefault[0]; - maxDeltaQP = MaxDeltaQPdefault[0]; - } - else if (pictureControlSetPtr->isUsedAsReferenceFlag) { - minDeltaQP = MinDeltaQPdefault[1]; - maxDeltaQP = MaxDeltaQPdefault[1]; - } - else { - minDeltaQP = MinDeltaQPdefault[2]; - maxDeltaQP = MaxDeltaQPdefault[2]; - } - - // Shape the min degrade - minDeltaQP = (((EB_S8)(minDeltaQP + MIN_DELTA_QP_SHAPE_TH) > 0) ? 0 : (minDeltaQP + MIN_DELTA_QP_SHAPE_TH)); - - // Shape the max degrade - maxDeltaQP = (((EB_S8)(maxDeltaQP - MAX_DELTA_QP_SHAPE_TH) < 0) ? 0 : (maxDeltaQP - MAX_DELTA_QP_SHAPE_TH)); - - contextPtr->minDeltaQP = minDeltaQP; - contextPtr->maxDeltaQP = maxDeltaQP; + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { + + EB_S8 minDeltaQP; + EB_U8 maxDeltaQP; + if (pictureControlSetPtr->temporalLayerIndex == 0) { + minDeltaQP = MinDeltaQPdefault[0]; + maxDeltaQP = MaxDeltaQPdefault[0]; + } + else if (pictureControlSetPtr->isUsedAsReferenceFlag) { + minDeltaQP = MinDeltaQPdefault[1]; + maxDeltaQP = MaxDeltaQPdefault[1]; + } + else { + minDeltaQP = MinDeltaQPdefault[2]; + maxDeltaQP = MaxDeltaQPdefault[2]; + } + + // Shape the min degrade + minDeltaQP = (((EB_S8)(minDeltaQP + MIN_DELTA_QP_SHAPE_TH) > 0) ? 0 : (minDeltaQP + MIN_DELTA_QP_SHAPE_TH)); + + // Shape the max degrade + maxDeltaQP = (((EB_S8)(maxDeltaQP - MAX_DELTA_QP_SHAPE_TH) < 0) ? 0 : (maxDeltaQP - MAX_DELTA_QP_SHAPE_TH)); + + contextPtr->minDeltaQP = minDeltaQP; + contextPtr->maxDeltaQP = maxDeltaQP; } static inline void DetermineMorePotentialAuraAreas( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U16 lcuIndex; - EB_S32 lcuHor, lcuVer, lcuVerOffset; - EB_U32 countOfEdgeBlocks = 0, countOfNonEdgeBlocks = 0; + EB_U16 lcuIndex; + EB_S32 lcuHor, lcuVer, lcuVerOffset; + EB_U32 countOfEdgeBlocks = 0, countOfNonEdgeBlocks = 0; - EB_U32 lightLumaValue = 150; + EB_U32 lightLumaValue = 150; - EB_U16 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; + EB_U16 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - // For all the internal LCUs - if (!lcuParams->isEdgeLcu) { - countOfNonEdgeBlocks = 0; + // For all the internal LCUs + if (!lcuParams->isEdgeLcu) { + countOfNonEdgeBlocks = 0; if (pictureControlSetPtr->edgeResultsPtr[lcuIndex].edgeBlockNum - && pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] >= lightLumaValue) { + && pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] >= lightLumaValue) { - for (lcuVer = -1; lcuVer <= 1; lcuVer++) { - lcuVerOffset = lcuVer * (EB_S32)sequenceControlSetPtr->pictureWidthInLcu; - for (lcuHor = -1; lcuHor <= 1; lcuHor++) { + for (lcuVer = -1; lcuVer <= 1; lcuVer++) { + lcuVerOffset = lcuVer * (EB_S32)sequenceControlSetPtr->pictureWidthInLcu; + for (lcuHor = -1; lcuHor <= 1; lcuHor++) { countOfNonEdgeBlocks += (!pictureControlSetPtr->edgeResultsPtr[lcuIndex + lcuVerOffset + lcuHor].edgeBlockNum) && - (pictureControlSetPtr->nonMovingIndexArray[lcuIndex + lcuVerOffset + lcuHor] < 30); - } - } - } + (pictureControlSetPtr->nonMovingIndexArray[lcuIndex + lcuVerOffset + lcuHor] < 30); + } + } + } - if (countOfNonEdgeBlocks > 1) { - countOfEdgeBlocks++; - } - } - } + if (countOfNonEdgeBlocks > 1) { + countOfEdgeBlocks++; + } + } + } - // To check the percentage of potential aura in the picture.. If a large area is detected then this is not isolated + // To check the percentage of potential aura in the picture.. If a large area is detected then this is not isolated pictureControlSetPtr->percentageOfEdgeinLightBackground = (EB_U8)(countOfEdgeBlocks * 100 / lcuTotalCount); } @@ -685,37 +685,37 @@ static inline void DetermineMorePotentialAuraAreas( * Detects the presence of dark area ***************************************************/ static void DeriveHighDarkAreaDensityFlag( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) { - - - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; - EB_U32 lumaHistogramBin; - EB_U32 blackSamplesCount = 0; - EB_U32 blackAreaPercentage; - // Loop over regions inside the picture - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions - for (lumaHistogramBin = 0; lumaHistogramBin < LOW_MEAN_TH_0; lumaHistogramBin++){ // loop over the 1st LOW_MEAN_THLD bins - blackSamplesCount += pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][lumaHistogramBin]; - } - } - } - - blackAreaPercentage = (blackSamplesCount * 100) / (sequenceControlSetPtr->lumaWidth * sequenceControlSetPtr->lumaHeight); + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { + + + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; + EB_U32 lumaHistogramBin; + EB_U32 blackSamplesCount = 0; + EB_U32 blackAreaPercentage; + // Loop over regions inside the picture + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions + for (lumaHistogramBin = 0; lumaHistogramBin < LOW_MEAN_TH_0; lumaHistogramBin++){ // loop over the 1st LOW_MEAN_THLD bins + blackSamplesCount += pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][lumaHistogramBin]; + } + } + } + + blackAreaPercentage = (blackSamplesCount * 100) / (sequenceControlSetPtr->lumaWidth * sequenceControlSetPtr->lumaHeight); pictureControlSetPtr->highDarkAreaDensityFlag = (EB_BOOL)(blackAreaPercentage >= MIN_BLACK_AREA_PERCENTAGE); blackSamplesCount = 0; - EB_U32 whiteSamplesCount = 0; - EB_U32 whiteAreaPercentage; + EB_U32 whiteSamplesCount = 0; + EB_U32 whiteAreaPercentage; // Loop over regions inside the picture for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions for (lumaHistogramBin = 0; lumaHistogramBin < LOW_MEAN_TH_1; lumaHistogramBin++){ // loop over the 1st LOW_MEAN_THLD bins blackSamplesCount += pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][lumaHistogramBin]; } - for (lumaHistogramBin = HIGH_MEAN_TH; lumaHistogramBin < HISTOGRAM_NUMBER_OF_BINS; lumaHistogramBin++){ + for (lumaHistogramBin = HIGH_MEAN_TH; lumaHistogramBin < HISTOGRAM_NUMBER_OF_BINS; lumaHistogramBin++){ whiteSamplesCount += pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][lumaHistogramBin]; } } @@ -728,76 +728,76 @@ static void DeriveHighDarkAreaDensityFlag( pictureControlSetPtr->highDarkLowLightAreaDensityFlag = (EB_BOOL)(blackAreaPercentage >= MIN_BLACK_AREA_PERCENTAGE) && (whiteAreaPercentage >= MIN_WHITE_AREA_PERCENTAGE); } -#define NORM_FACTOR 10 -#define VAR_MIN 10 -#define VAR_MAX 300 -#define MIN_Y 70 -#define MAX_Y 145 -#define MID_CB 140 -#define MID_CR 115 -#define TH_CB 10 -#define TH_CR 15 +#define NORM_FACTOR 10 +#define VAR_MIN 10 +#define VAR_MAX 300 +#define MIN_Y 70 +#define MAX_Y 145 +#define MID_CB 140 +#define MID_CR 115 +#define TH_CB 10 +#define TH_CR 15 /****************************************************** * High contrast classifier ******************************************************/ static void TemporalHighContrastClassifier( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 blkIt; - EB_U32 nsadTable[] = { 10, 5, 5, 5, 5, 5 }; - EB_U32 thRes = 0; - EB_U32 nsad; - EB_U32 meDist = 0; - - if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ - - - for (blkIt = 0; blkIt < 4; blkIt++) { - - nsad = ((EB_U32)pictureControlSetPtr->meResults[lcuIndex][1 + blkIt].distortionDirection[0].distortion) >> NORM_FACTOR; - - if (nsad >= nsadTable[pictureControlSetPtr->temporalLayerIndex] + thRes) - meDist++; - } - - } - contextPtr->highDist = meDist>0 ? EB_TRUE : EB_FALSE; + EB_U32 blkIt; + EB_U32 nsadTable[] = { 10, 5, 5, 5, 5, 5 }; + EB_U32 thRes = 0; + EB_U32 nsad; + EB_U32 meDist = 0; + + if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ + + + for (blkIt = 0; blkIt < 4; blkIt++) { + + nsad = ((EB_U32)pictureControlSetPtr->meResults[lcuIndex][1 + blkIt].distortionDirection[0].distortion) >> NORM_FACTOR; + + if (nsad >= nsadTable[pictureControlSetPtr->temporalLayerIndex] + thRes) + meDist++; + } + + } + contextPtr->highDist = meDist>0 ? EB_TRUE : EB_FALSE; } static void SpatialHighContrastClassifier( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 blkIt; + EB_U32 blkIt; - contextPtr->highContrastNum = 0; + contextPtr->highContrastNum = 0; - //16x16 blocks - for (blkIt = 0; blkIt < 16; blkIt++) { + //16x16 blocks + for (blkIt = 0; blkIt < 16; blkIt++) { - EB_U8 ymean = contextPtr->yMeanPtr[5 + blkIt]; - EB_U8 umean = contextPtr->cbMeanPtr[5 + blkIt]; - EB_U8 vmean = contextPtr->crMeanPtr[5 + blkIt]; + EB_U8 ymean = contextPtr->yMeanPtr[5 + blkIt]; + EB_U8 umean = contextPtr->cbMeanPtr[5 + blkIt]; + EB_U8 vmean = contextPtr->crMeanPtr[5 + blkIt]; - EB_U16 var = pictureControlSetPtr->variance[lcuIndex][5 + blkIt]; + EB_U16 var = pictureControlSetPtr->variance[lcuIndex][5 + blkIt]; - if (var>VAR_MIN && varMIN_Y && ymean < MAX_Y && //medium brightness(not too dark and not too bright) - ABS((EB_S64)umean - MID_CB) < TH_CB && //middle of the color plane - ABS((EB_S64)vmean - MID_CR) < TH_CR //middle of the color plane - ) - { - contextPtr->highContrastNum++; + if (var>VAR_MIN && varMIN_Y && ymean < MAX_Y && //medium brightness(not too dark and not too bright) + ABS((EB_S64)umean - MID_CB) < TH_CB && //middle of the color plane + ABS((EB_S64)vmean - MID_CR) < TH_CR //middle of the color plane + ) + { + contextPtr->highContrastNum++; - } + } - } + } } /****************************************************** @@ -806,8 +806,8 @@ Output : populate to neighbor LCUs ******************************************************/ static void PopulateFromCurrentLcuToNeighborLcus( PictureParentControlSet_t *pictureControlSetPtr, - EB_BOOL inputToPopulate, - EB_BOOL *outputBuffer, + EB_BOOL inputToPopulate, + EB_BOOL *outputBuffer, EB_U32 lcuAddr, EB_U32 lcuOriginX, EB_U32 lcuOriginY) @@ -861,7 +861,7 @@ Input : variance Output : true if current & neighbors are spatially complex ******************************************************/ static EB_BOOL IsSpatiallyComplexArea( - PictureParentControlSet_t *pictureControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuAddr, EB_U32 lcuOriginX, EB_U32 lcuOriginY) @@ -977,14 +977,14 @@ static void DeriveBlockinessPresentFlag( lcuParamPtr->originY) && pictureControlSetPtr->nonMovingIndexArray[lcuIndex] != INVALID_ZZ_COST && pictureControlSetPtr->nonMovingIndexAverage != INVALID_ZZ_COST - + ) { - // Active LCU within an active scene (added a check on 4K & non-BASE to restrict the action - could be generated for all resolutions/layers) + // Active LCU within an active scene (added a check on 4K & non-BASE to restrict the action - could be generated for all resolutions/layers) if (pictureControlSetPtr->nonMovingIndexArray[lcuIndex] == LCU_COMPLEXITY_NON_MOVING_INDEX_TH_0 && pictureControlSetPtr->nonMovingIndexAverage >= LCU_COMPLEXITY_NON_MOVING_INDEX_TH_1 && pictureControlSetPtr->temporalLayerIndex > 0 && sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { pictureControlSetPtr->complexLcuArray[lcuIndex] = LCU_COMPLEXITY_STATUS_2; } - // Active LCU within a scene with a moderate acitivity (eg. active foregroud & static background) + // Active LCU within a scene with a moderate acitivity (eg. active foregroud & static background) else if (pictureControlSetPtr->nonMovingIndexArray[lcuIndex] == LCU_COMPLEXITY_NON_MOVING_INDEX_TH_0 && pictureControlSetPtr->nonMovingIndexAverage >= LCU_COMPLEXITY_NON_MOVING_INDEX_TH_2 && pictureControlSetPtr->nonMovingIndexAverage < LCU_COMPLEXITY_NON_MOVING_INDEX_TH_1) { pictureControlSetPtr->complexLcuArray[lcuIndex] = LCU_COMPLEXITY_STATUS_1; } @@ -1000,7 +1000,7 @@ static void DeriveBlockinessPresentFlag( } static void QpmGatherStatistics( - SequenceControlSet_t *sequenceControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuIndex) { @@ -1024,14 +1024,14 @@ static void QpmGatherStatistics( if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { mdScanCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanCuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; if (pictureControlSetPtr->cu8x8Mode == CU_8x8_MODE_0 && oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0][0].validDistortion) { oisSad = oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0][0].distortion; } else { - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[mdScanCuIndex]); const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; if (oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion) { @@ -1067,7 +1067,7 @@ static void QpmGatherStatistics( if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; oisSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; @@ -1092,7 +1092,7 @@ static void QpmGatherStatistics( - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; oisSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; @@ -1116,7 +1116,7 @@ static void QpmGatherStatistics( if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64]) { - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; @@ -1144,7 +1144,7 @@ static void QpmGatherStatistics( static void StationaryEdgeOverUpdateOverTimeLcu( SequenceControlSet_t *sequenceControlSetPtr, - EB_U32 totalCheckedPictures, + EB_U32 totalCheckedPictures, PictureParentControlSet_t *pictureControlSetPtr, EB_U32 totalLcuCount) { @@ -1199,7 +1199,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1260,7 +1260,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1290,7 +1290,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1332,7 +1332,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1362,7 +1362,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1399,13 +1399,13 @@ static void StationaryEdgeOverUpdateOverTimeLcu( ************************************************/ void* SourceBasedOperationsKernel(void *inputPtr) { - SourceBasedOperationsContext_t *contextPtr = (SourceBasedOperationsContext_t*)inputPtr; + SourceBasedOperationsContext_t *contextPtr = (SourceBasedOperationsContext_t*)inputPtr; PictureParentControlSet_t *pictureControlSetPtr; - SequenceControlSet_t *sequenceControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; EbObjectWrapper_t *inputResultsWrapperPtr; - InitialRateControlResults_t *inputResultsPtr; + InitialRateControlResults_t *inputResultsPtr; EbObjectWrapper_t *outputResultsWrapperPtr; - PictureDemuxResults_t *outputResultsPtr; + PictureDemuxResults_t *outputResultsPtr; for (;;) { @@ -1415,74 +1415,74 @@ void* SourceBasedOperationsKernel(void *inputPtr) &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (InitialRateControlResults_t*)inputResultsWrapperPtr->objectPtr; + inputResultsPtr = (InitialRateControlResults_t*)inputResultsWrapperPtr->objectPtr; pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld SRC IN \n", pictureControlSetPtr->pictureNumber); #endif - pictureControlSetPtr->darkBackGroundlightForeGround = EB_FALSE; - contextPtr->pictureNumGrassLcu = 0; - contextPtr->countOfMovingLcus = 0; - contextPtr->countOfNonMovingLcus = 0; - contextPtr->yNonMovingMean = 0; - contextPtr->yMovingMean = 0; - contextPtr->toBeIntraCodedProbability = 0; - contextPtr->depth1BlockNum = 0; - - EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; - EB_U32 lcuIndex; + pictureControlSetPtr->darkBackGroundlightForeGround = EB_FALSE; + contextPtr->pictureNumGrassLcu = 0; + contextPtr->countOfMovingLcus = 0; + contextPtr->countOfNonMovingLcus = 0; + contextPtr->yNonMovingMean = 0; + contextPtr->yMovingMean = 0; + contextPtr->toBeIntraCodedProbability = 0; + contextPtr->depth1BlockNum = 0; + + EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; + EB_U32 lcuIndex; - /***********************************************LCU-based operations************************************************************/ - for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { + /***********************************************LCU-based operations************************************************************/ + for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - pictureControlSetPtr->lcuCmplxContrastArray[lcuIndex] = 0; + pictureControlSetPtr->lcuCmplxContrastArray[lcuIndex] = 0; EB_BOOL isCompleteLcu = lcuParams->isCompleteLcu; - EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; + EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; - _mm_prefetch((const char*)yMeanPtr, _MM_HINT_T0); + _mm_prefetch((const char*)yMeanPtr, _MM_HINT_T0); - EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; - EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; + EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; + EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; - _mm_prefetch((const char*)crMeanPtr, _MM_HINT_T0); - _mm_prefetch((const char*)cbMeanPtr, _MM_HINT_T0); + _mm_prefetch((const char*)crMeanPtr, _MM_HINT_T0); + _mm_prefetch((const char*)cbMeanPtr, _MM_HINT_T0); - contextPtr->yMeanPtr = yMeanPtr; - contextPtr->crMeanPtr = crMeanPtr; - contextPtr->cbMeanPtr = cbMeanPtr; + contextPtr->yMeanPtr = yMeanPtr; + contextPtr->crMeanPtr = crMeanPtr; + contextPtr->cbMeanPtr = cbMeanPtr; - // Grass & Skin detection + // Grass & Skin detection GrassSkinLcu( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - - // Spatial high contrast classifier - if (isCompleteLcu) { - SpatialHighContrastClassifier( - contextPtr, - pictureControlSetPtr, - lcuIndex); - } - - // Luma Contrast detection - LumaContrastDetectorLcu( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - - // AC energy computation - CalculateAcEnergy( - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - - // Failing Motion Detection + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + + // Spatial high contrast classifier + if (isCompleteLcu) { + SpatialHighContrastClassifier( + contextPtr, + pictureControlSetPtr, + lcuIndex); + } + + // Luma Contrast detection + LumaContrastDetectorLcu( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + + // AC energy computation + CalculateAcEnergy( + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + + // Failing Motion Detection pictureControlSetPtr->failingMotionLcuFlag[lcuIndex] = EB_FALSE; if (pictureControlSetPtr->sliceType != EB_I_PICTURE && isCompleteLcu){ @@ -1493,24 +1493,24 @@ void* SourceBasedOperationsKernel(void *inputPtr) lcuIndex); } - pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = EB_FALSE; - if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ - - if (isCompleteLcu && (!pictureControlSetPtr->similarColocatedLcuArray[lcuIndex])){ - DetectUncoveredLcu( - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - } - } - - // Uncovered area detection II - // Temporal high contrast classifier - if (isCompleteLcu) { - TemporalHighContrastClassifier( - contextPtr, - pictureControlSetPtr, - lcuIndex); + pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = EB_FALSE; + if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ + + if (isCompleteLcu && (!pictureControlSetPtr->similarColocatedLcuArray[lcuIndex])){ + DetectUncoveredLcu( + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + } + } + + // Uncovered area detection II + // Temporal high contrast classifier + if (isCompleteLcu) { + TemporalHighContrastClassifier( + contextPtr, + pictureControlSetPtr, + lcuIndex); if (contextPtr->highContrastNum && contextPtr->highDist) { PopulateFromCurrentLcuToNeighborLcus( @@ -1522,50 +1522,50 @@ void* SourceBasedOperationsKernel(void *inputPtr) lcuParams->originY); } - } + } - } + } - /*********************************************Picture-based operations**********************************************************/ - LumaContrastDetectorPicture( - contextPtr, - pictureControlSetPtr); + /*********************************************Picture-based operations**********************************************************/ + LumaContrastDetectorPicture( + contextPtr, + pictureControlSetPtr); - // Delta QP range adjustments - SetDefaultDeltaQpRange( - contextPtr, - pictureControlSetPtr); + // Delta QP range adjustments + SetDefaultDeltaQpRange( + contextPtr, + pictureControlSetPtr); - // Dark density derivation (histograms not available when no SCD) - DeriveHighDarkAreaDensityFlag( - sequenceControlSetPtr, - pictureControlSetPtr); + // Dark density derivation (histograms not available when no SCD) + DeriveHighDarkAreaDensityFlag( + sequenceControlSetPtr, + pictureControlSetPtr); - // Detect and mark LCU and 32x32 CUs which belong to an isolated non-homogeneous region surrounding a homogenous and flat region. - DetermineIsolatedNonHomogeneousRegionInPicture( - sequenceControlSetPtr, - pictureControlSetPtr); + // Detect and mark LCU and 32x32 CUs which belong to an isolated non-homogeneous region surrounding a homogenous and flat region. + DetermineIsolatedNonHomogeneousRegionInPicture( + sequenceControlSetPtr, + pictureControlSetPtr); - // Detect aura areas in lighter background when subject is moving similar to background - DetermineMorePotentialAuraAreas( - sequenceControlSetPtr, - pictureControlSetPtr); + // Detect aura areas in lighter background when subject is moving similar to background + DetermineMorePotentialAuraAreas( + sequenceControlSetPtr, + pictureControlSetPtr); - // Activity statistics derivation - DerivePictureActivityStatistics( - sequenceControlSetPtr, - pictureControlSetPtr); + // Activity statistics derivation + DerivePictureActivityStatistics( + sequenceControlSetPtr, + pictureControlSetPtr); // Derive blockinessPresentFlag DeriveBlockinessPresentFlag( sequenceControlSetPtr, pictureControlSetPtr); - // Skin & Grass detection - GrassSkinPicture( - contextPtr, - pictureControlSetPtr); + // Skin & Grass detection + GrassSkinPicture( + contextPtr, + pictureControlSetPtr); // Complexity Classification ComplexityClassifier32x32( @@ -1573,7 +1573,7 @@ void* SourceBasedOperationsKernel(void *inputPtr) pictureControlSetPtr); - // Stationary edge over time (final stage) + // Stationary edge over time (final stage) if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { StationaryEdgeOverUpdateOverTimeLcu( sequenceControlSetPtr, @@ -1677,9 +1677,9 @@ void* SourceBasedOperationsKernel(void *inputPtr) contextPtr->pictureDemuxResultsOutputFifoPtr, &outputResultsWrapperPtr); - outputResultsPtr = (PictureDemuxResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr = (PictureDemuxResults_t*)outputResultsWrapperPtr->objectPtr; outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; - outputResultsPtr->pictureType = EB_PIC_INPUT; + outputResultsPtr->pictureType = EB_PIC_INPUT; // Release the Input Results EbReleaseObject(inputResultsWrapperPtr); diff --git a/Source/Lib/Codec/EbSourceBasedOperationsProcess.h b/Source/Lib/Codec/EbSourceBasedOperationsProcess.h index bd2fe5953..b663ea566 100644 --- a/Source/Lib/Codec/EbSourceBasedOperationsProcess.h +++ b/Source/Lib/Codec/EbSourceBasedOperationsProcess.h @@ -15,15 +15,15 @@ extern "C" { typedef struct CuComplexityInfo_s { - EB_U32 spatioTemporalWeight; - EB_U32 currentTemporalComplexity; - EB_U32 currentSpatialComplexity; - EB_U64 spatioTemporalComplexity; - EB_U32 currentMotionComplexity; - EB_U32 currentspatioTemporalComplexity; - EB_U32 spatialComplexity; - EB_U32 temporalComplexity; - EB_U8 complextityDecreaseFactor; + EB_U32 spatioTemporalWeight; + EB_U32 currentTemporalComplexity; + EB_U32 currentSpatialComplexity; + EB_U64 spatioTemporalComplexity; + EB_U32 currentMotionComplexity; + EB_U32 currentspatioTemporalComplexity; + EB_U32 spatialComplexity; + EB_U32 temporalComplexity; + EB_U8 complextityDecreaseFactor; } CuComplexityInfo_t; @@ -33,37 +33,37 @@ typedef struct CuComplexityInfo_s typedef struct SourceBasedOperationsContext_s { - EbFifo_t *initialrateControlResultsInputFifoPtr; - EbFifo_t *pictureDemuxResultsOutputFifoPtr; + EbFifo_t *initialrateControlResultsInputFifoPtr; + EbFifo_t *pictureDemuxResultsOutputFifoPtr; - // Delta QP Map - EB_S8 minDeltaQP; - EB_U8 maxDeltaQP; + // Delta QP Map + EB_S8 minDeltaQP; + EB_U8 maxDeltaQP; - EB_S16 minDeltaQpWeight[3][4]; - EB_S16 maxDeltaQpWeight[3][4]; + EB_S16 minDeltaQpWeight[3][4]; + EB_S16 maxDeltaQpWeight[3][4]; - // Skin - EB_U8 grassPercentageInPicture; - EB_U8 picturePercentageFaceSkinLcu; + // Skin + EB_U8 grassPercentageInPicture; + EB_U8 picturePercentageFaceSkinLcu; - // local zz cost array - EB_U32 pictureNumGrassLcu; + // local zz cost array + EB_U32 pictureNumGrassLcu; - EB_U32 highContrastNum; + EB_U32 highContrastNum; - EB_BOOL highDist; - EB_U32 countOfMovingLcus; - EB_U32 countOfNonMovingLcus; - EB_U64 yNonMovingMean; - EB_U64 yMovingMean; - EB_U32 toBeIntraCodedProbability; - EB_U32 depth1BlockNum; + EB_BOOL highDist; + EB_U32 countOfMovingLcus; + EB_U32 countOfNonMovingLcus; + EB_U64 yNonMovingMean; + EB_U64 yMovingMean; + EB_U32 toBeIntraCodedProbability; + EB_U32 depth1BlockNum; EB_U8 *yMeanPtr; - EB_U8 *crMeanPtr; - EB_U8 *cbMeanPtr; + EB_U8 *crMeanPtr; + EB_U8 *cbMeanPtr; } SourceBasedOperationsContext_t; @@ -73,12 +73,12 @@ typedef struct SourceBasedOperationsContext_s extern EB_ERRORTYPE SourceBasedOperationsContextCtor( SourceBasedOperationsContext_t **contextDblPtr, - EbFifo_t *initialrateControlResultsInputFifoPtr, - EbFifo_t *pictureDemuxResultsOutputFifoPtr); + EbFifo_t *initialrateControlResultsInputFifoPtr, + EbFifo_t *pictureDemuxResultsOutputFifoPtr); extern void* SourceBasedOperationsKernel(void *inputPtr); #ifdef __cplusplus } #endif -#endif // EbSourceBasedOperations_h \ No newline at end of file +#endif // EbSourceBasedOperations_h diff --git a/Source/Lib/Codec/EbSyntaxElements.h b/Source/Lib/Codec/EbSyntaxElements.h index 5ea243e64..b802ed959 100644 --- a/Source/Lib/Codec/EbSyntaxElements.h +++ b/Source/Lib/Codec/EbSyntaxElements.h @@ -51,8 +51,8 @@ typedef enum NalRefIdc { #define EB_INTRA_MODE_32 32 #define EB_INTRA_MODE_33 33 #define EB_INTRA_MODE_34 34 -#define EB_INTRA_MODE_35 35 -#define EB_INTRA_MODE_4x4 36 +#define EB_INTRA_MODE_35 35 +#define EB_INTRA_MODE_4x4 36 #define EB_INTRA_MODE_INVALID ~0u #define EB_INTRA_CHROMA_PLANAR 0 @@ -71,4 +71,4 @@ typedef enum NalRefIdc { #ifdef __cplusplus } #endif -#endif // EbSyntaxElements_h \ No newline at end of file +#endif // EbSyntaxElements_h diff --git a/Source/Lib/Codec/EbSystemResourceManager.c b/Source/Lib/Codec/EbSystemResourceManager.c index 4f39c69ce..c2718da40 100644 --- a/Source/Lib/Codec/EbSystemResourceManager.c +++ b/Source/Lib/Codec/EbSystemResourceManager.c @@ -92,7 +92,7 @@ static EB_BOOL EbFifoPeakFront( return EB_TRUE; } else { - return EB_FALSE; + return EB_FALSE; } } @@ -197,7 +197,7 @@ static EB_ERRORTYPE EbCircularBufferPushFront( // Increment the Current Count ++bufferPtr->currentCount; - + return return_error; } @@ -321,18 +321,18 @@ static EB_ERRORTYPE EbMuxingQueueObjectPushBack( * EbMuxingQueueObjectPushFront **************************************/ static EB_ERRORTYPE EbMuxingQueueObjectPushFront( - EbMuxingQueue_t *queuePtr, - EbObjectWrapper_t *objectPtr) + EbMuxingQueue_t *queuePtr, + EbObjectWrapper_t *objectPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EbCircularBufferPushFront( - queuePtr->objectQueue, - objectPtr); + EbCircularBufferPushFront( + queuePtr->objectQueue, + objectPtr); - EbMuxingQueueAssignation(queuePtr); + EbMuxingQueueAssignation(queuePtr); - return return_error; + return return_error; } /********************************************************************* @@ -602,9 +602,9 @@ EB_ERRORTYPE EbReleaseObject( // Set liveCount to EB_ObjectWrapperReleasedValue objectPtr->liveCount = EB_ObjectWrapperReleasedValue; - EbMuxingQueueObjectPushFront( - objectPtr->systemResourcePtr->emptyQueue, - objectPtr); + EbMuxingQueueObjectPushFront( + objectPtr->systemResourcePtr->emptyQueue, + objectPtr); } @@ -741,4 +741,4 @@ EB_ERRORTYPE EbGetFullObjectNonBlocking( *wrapperDblPtr = (EbObjectWrapper_t*)EB_NULL; return return_error; -} \ No newline at end of file +} diff --git a/Source/Lib/Codec/EbThreads.c b/Source/Lib/Codec/EbThreads.c index 9bd13ee4e..29c2915b1 100644 --- a/Source/Lib/Codec/EbThreads.c +++ b/Source/Lib/Codec/EbThreads.c @@ -34,11 +34,11 @@ #include void printfTime(const char *fmt, ...) { - va_list args; - va_start(args, fmt); + va_list args; + va_start(args, fmt); SVT_LOG(" [%i ms]\t", ((int)clock())); - vprintf(fmt, args); - va_end(args); + vprintf(fmt, args); + va_end(args); } #endif #endif @@ -62,8 +62,8 @@ EB_HANDLE EbCreateThread( NULL); // new thread ID #elif __linux__ - - pthread_attr_t attr; + + pthread_attr_t attr; struct sched_param param = { .sched_priority = 99 }; @@ -145,7 +145,7 @@ EB_HANDLE EbCreateSemaphore( (sem_t*) semaphoreHandle, // semaphore handle 0, // shared semaphore (not local) initialCount); // initial count -#endif // _WIN32 +#endif // _WIN32 return semaphoreHandle; } diff --git a/Source/Lib/Codec/EbThreads.h b/Source/Lib/Codec/EbThreads.h index 05cf105d9..cca364075 100644 --- a/Source/Lib/Codec/EbThreads.h +++ b/Source/Lib/Codec/EbThreads.h @@ -109,12 +109,12 @@ extern cpu_set_t groupAffinity; pthread_setaffinity_np(*((pthread_t*)pointer),sizeof(cpu_set_t),&groupAffinity); \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -129,12 +129,12 @@ extern cpu_set_t groupAffinity; else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ diff --git a/Source/Lib/Codec/EbTransQuantBuffers.c b/Source/Lib/Codec/EbTransQuantBuffers.c index 740d03305..9ecc50eaf 100644 --- a/Source/Lib/Codec/EbTransQuantBuffers.c +++ b/Source/Lib/Codec/EbTransQuantBuffers.c @@ -20,10 +20,10 @@ EB_ERRORTYPE EbTransQuantBuffersCtor( transCoeffInitArray.bitDepth = EB_16BIT; transCoeffInitArray.colorFormat = EB_YUV420; transCoeffInitArray.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; - transCoeffInitArray.leftPadding = 0; - transCoeffInitArray.rightPadding = 0; - transCoeffInitArray.topPadding = 0; - transCoeffInitArray.botPadding = 0; + transCoeffInitArray.leftPadding = 0; + transCoeffInitArray.rightPadding = 0; + transCoeffInitArray.topPadding = 0; + transCoeffInitArray.botPadding = 0; transCoeffInitArray.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( diff --git a/Source/Lib/Codec/EbTransQuantBuffers.h b/Source/Lib/Codec/EbTransQuantBuffers.h index 9613f1daa..6cc979f63 100644 --- a/Source/Lib/Codec/EbTransQuantBuffers.h +++ b/Source/Lib/Codec/EbTransQuantBuffers.h @@ -14,20 +14,20 @@ extern "C" { #endif typedef struct EbTransQuantBuffers_s { - EbPictureBufferDesc_t *tuTransCoeff2Nx2NPtr; - EbPictureBufferDesc_t *tuTransCoeffNxNPtr; - EbPictureBufferDesc_t *tuTransCoeffN2xN2Ptr; - EbPictureBufferDesc_t *tuQuantCoeffNxNPtr; - EbPictureBufferDesc_t *tuQuantCoeffN2xN2Ptr; + EbPictureBufferDesc_t *tuTransCoeff2Nx2NPtr; + EbPictureBufferDesc_t *tuTransCoeffNxNPtr; + EbPictureBufferDesc_t *tuTransCoeffN2xN2Ptr; + EbPictureBufferDesc_t *tuQuantCoeffNxNPtr; + EbPictureBufferDesc_t *tuQuantCoeffN2xN2Ptr; } EbTransQuantBuffers_t; - + extern EB_ERRORTYPE EbTransQuantBuffersCtor( - EbTransQuantBuffers_t *transQuantBuffersPtr); - - + EbTransQuantBuffers_t *transQuantBuffersPtr); + + #ifdef __cplusplus } #endif -#endif // EbTransQuantBuffers_h \ No newline at end of file +#endif // EbTransQuantBuffers_h diff --git a/Source/Lib/Codec/EbTransformUnit.h b/Source/Lib/Codec/EbTransformUnit.h index ab5abcc1a..99dc765cb 100644 --- a/Source/Lib/Codec/EbTransformUnit.h +++ b/Source/Lib/Codec/EbTransformUnit.h @@ -23,18 +23,18 @@ typedef struct TransformUnit_s { unsigned cbCbf : 1; unsigned crCbf : 1; unsigned lumaCbf : 1; - unsigned transCoeffShapeLuma : 2; - unsigned transCoeffShapeChroma : 2; - unsigned transCoeffShapeChroma2 : 2; + unsigned transCoeffShapeLuma : 2; + unsigned transCoeffShapeChroma : 2; + unsigned transCoeffShapeChroma2 : 2; unsigned cbCbf2 : 1; unsigned crCbf2 : 1; EB_U16 nzCoefCount[3]; - EB_BOOL isOnlyDc[3]; + EB_BOOL isOnlyDc[3]; EB_U16 nzCoefCount2[2]; EB_BOOL isOnlyDc2[3]; -} TransformUnit_t; +} TransformUnit_t; #pragma pack(pop) #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbTransforms.c b/Source/Lib/Codec/EbTransforms.c index 563712e31..071ca82e9 100644 --- a/Source/Lib/Codec/EbTransforms.c +++ b/Source/Lib/Codec/EbTransforms.c @@ -13,107 +13,107 @@ #include "EbLambdaRateTables.h" static inline EB_U32 CheckNZero4x4( - EB_S16 *coeff, - EB_U32 coeffStride - ) + EB_S16 *coeff, + EB_U32 coeffStride + ) { - const EB_U32 stride = coeffStride / 4; + const EB_U32 stride = coeffStride / 4; - EB_U64 * coefPtr = (EB_U64 *)coeff; + EB_U64 * coefPtr = (EB_U64 *)coeff; - if (coefPtr[0] > 0) - return 1; - else if (coefPtr[stride] > 0) - return 1; - else if (coefPtr[2 * stride] > 0) - return 1; - else if (coefPtr[3 * stride] > 0) - return 1; + if (coefPtr[0] > 0) + return 1; + else if (coefPtr[stride] > 0) + return 1; + else if (coefPtr[2 * stride] > 0) + return 1; + else if (coefPtr[3 * stride] > 0) + return 1; - return 0; + return 0; } void MatMultOut( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32 *nonzerocoeff){ - - EB_U32 coeffLocation = 0, coeffOutLocation=0; - EB_U32 rowIndex, colIndex; - EB_S32 coeffTemp; - - *nonzerocoeff = 0; - - for (rowIndex = 0; rowIndex < computeSize; ++rowIndex) { - for (colIndex = 0; colIndex < computeSize; ++colIndex) { - coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex +rowIndex *maskingMatrixStride] + offset) >> shiftNum; - coeffTemp = (coeff[coeffLocation] < 0) ? -coeffTemp : coeffTemp; - - coeffOut[coeffOutLocation] = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp); - - (*nonzerocoeff) += (coeffTemp != 0); - ++coeffLocation; - ++coeffOutLocation; - } - coeffLocation += coeffStride - computeSize; - coeffOutLocation += coeffOutStride - computeSize; - } + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32 *nonzerocoeff){ + + EB_U32 coeffLocation = 0, coeffOutLocation=0; + EB_U32 rowIndex, colIndex; + EB_S32 coeffTemp; + + *nonzerocoeff = 0; + + for (rowIndex = 0; rowIndex < computeSize; ++rowIndex) { + for (colIndex = 0; colIndex < computeSize; ++colIndex) { + coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex +rowIndex *maskingMatrixStride] + offset) >> shiftNum; + coeffTemp = (coeff[coeffLocation] < 0) ? -coeffTemp : coeffTemp; + + coeffOut[coeffOutLocation] = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp); + + (*nonzerocoeff) += (coeffTemp != 0); + ++coeffLocation; + ++coeffOutLocation; + } + coeffLocation += coeffStride - computeSize; + coeffOutLocation += coeffOutStride - computeSize; + } } EB_ERRORTYPE PmEstimateQuantCoeffLuma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); EB_ERRORTYPE PmEstimateQuantCoeffChroma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); typedef EB_ERRORTYPE(*PM_RATE_EST_TYPE)( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); static PM_RATE_EST_TYPE FUNC_TABLE CoeffRateEst4x4_funcPtrArray[EB_ASM_TYPE_TOTAL][2/*Luma+Chroma*/] = { - { EstimateQuantizedCoefficients_Lossy, EstimateQuantizedCoefficients_Lossy }, - { PmEstimateQuantCoeffLuma_SSE2, PmEstimateQuantCoeffChroma_SSE2 } + { EstimateQuantizedCoefficients_Lossy, EstimateQuantizedCoefficients_Lossy }, + { PmEstimateQuantCoeffLuma_SSE2, PmEstimateQuantCoeffChroma_SSE2 } }; @@ -122,32 +122,32 @@ static PM_RATE_EST_TYPE FUNC_TABLE CoeffRateEst4x4_funcPtrArray[EB_ASM_TYPE_TOTA *****************************/ EB_U64 GetPMCost( - EB_U64 lambda, - EB_U64 tuDistortion, - EB_U64 yTuCoeffBits - ); + EB_U64 lambda, + EB_U64 tuDistortion, + EB_U64 yTuCoeffBits + ); EB_ERRORTYPE TuEstimateCoeffBits_R( - EB_U32 tuOriginIndex, - EB_U32 tuChromaOriginIndex, - EB_U32 componentMask, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 yCountNonZeroCoeffs, - EB_U32 cbCountNonZeroCoeffs, - EB_U32 crCountNonZeroCoeffs, - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 partialFrequencyN2Flag, + EB_U32 tuOriginIndex, + EB_U32 tuChromaOriginIndex, + EB_U32 componentMask, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 yCountNonZeroCoeffs, + EB_U32 cbCountNonZeroCoeffs, + EB_U32 crCountNonZeroCoeffs, + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 partialFrequencyN2Flag, EB_BOOL coeffCabacUpdate, CoeffCtxtMdl_t *updatedCoeffCtxModel, - CabacCost_t *CabacCost); + CabacCost_t *CabacCost); /***************************** * Defines @@ -480,7 +480,7 @@ EB_ALIGN(16) const EB_S16 TransformAsmConst_SSE4_1[] = { #define M_25 25*PMP_MAX/100 #define M_20 20*PMP_MAX/100 #define M_10 10*PMP_MAX/100 -#define M_0 0*PMP_MAX/100 +#define M_0 0*PMP_MAX/100 // Level0 // 4K @@ -949,7 +949,7 @@ static const EB_U16 MaskingMatrix32x32_Level2_1080p[] = { // Level3 -// 4K +// 4K // 4x4 static const EB_U16 MaskingMatrix4x4_Level3_4K[] = { M_100, M_90, M_0, M_0, @@ -1230,22 +1230,22 @@ static const EB_U16 *MaskingMatrix[2][8][4] =// #define M_000 0 * PMP_MAX / 100 static const EB_U16 MaskingMatrix4x4_100[] = { - M_100, M_100, M_100, M_100, - M_100, M_100, M_100, M_100, - M_100, M_100, M_100, M_100, - M_100, M_100, M_100, M_100 + M_100, M_100, M_100, M_100, + M_100, M_100, M_100, M_100, + M_100, M_100, M_100, M_100, + M_100, M_100, M_100, M_100 }; static const EB_U16 MaskingMatrix4x4_70[] = { - M_70, M_70, M_70, M_70, - M_70, M_70, M_70, M_70, - M_70, M_70, M_70, M_70, - M_70, M_70, M_70, M_70 + M_70, M_70, M_70, M_70, + M_70, M_70, M_70, M_70, + M_70, M_70, M_70, M_70, + M_70, M_70, M_70, M_70 }; static const EB_U16 MaskingMatrix4x4_50[] = { - M_50, M_50, M_50, M_50, - M_50, M_50, M_50, M_50, - M_50, M_50, M_50, M_50, - M_50, M_50, M_50, M_50 + M_50, M_50, M_50, M_50, + M_50, M_50, M_50, M_50, + M_50, M_50, M_50, M_50, + M_50, M_50, M_50, M_50 }; // Group 0 (identity) @@ -1546,172 +1546,172 @@ static const EB_U16 MaskingMatrix32x32_2_1[] = { // Group3_1 // 4x4 static const EB_U16 MaskingMatrix4x4_3_1[] = { - M_095, M_095, M_000, M_000, - M_095, M_095, M_000, M_000, - M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, + M_095, M_095, M_000, M_000, + M_095, M_095, M_000, M_000, + M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, }; // 8x8 static const EB_U16 MaskingMatrix8x8_3_1[] = { - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 16x16 static const EB_U16 MaskingMatrix16x16_3_1[] = { - M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 32x32 static const EB_U16 MaskingMatrix32x32_3_1[] = { - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // Group4_1 // 4x4 static const EB_U16 MaskingMatrix4x4_4_1[] = { - M_095, M_080, M_000, M_000, - M_080, M_080, M_000, M_000, - M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, + M_095, M_080, M_000, M_000, + M_080, M_080, M_000, M_000, + M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, }; // 8x8 static const EB_U16 MaskingMatrix8x8_4_1[] = { - M_095, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_095, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 16x16 static const EB_U16 MaskingMatrix16x16_4_1[] = { - M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 32x32 static const EB_U16 MaskingMatrix32x32_4_1[] = { - M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; @@ -1849,37 +1849,37 @@ static const EB_U16 MaskingMatrix32x32_4[] = { M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, @@ -1913,17 +1913,17 @@ static const EB_U16 MaskingMatrix16x16_5[] = { M_100, M_100, M_100, M_100, M_040, M_040, M_040, M_040, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, @@ -1935,37 +1935,37 @@ static const EB_U16 MaskingMatrix32x32_5[] = { M_100, M_100, M_100, M_100, M_060, M_060, M_060, M_060, M_040, M_040, M_040, M_040, M_040, M_040, M_040, M_040, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_050, M_050, M_050, M_050, M_040, M_040, M_040, M_040, M_040, M_040, M_040, M_040, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_050, M_050, M_050, M_050, M_040, M_040, M_040, M_040, M_040, M_040, M_040, M_040, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_060, M_060, M_050, M_050, M_050, M_050, M_050, M_050, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_060, M_060, M_050, M_050, M_050, M_050, M_050, M_050, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_060, M_060, M_050, M_050, M_050, M_050, M_050, M_050, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_060, M_060, M_050, M_050, M_050, M_050, M_050, M_050, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_040, M_040, M_040, M_040, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, @@ -2024,22 +2024,22 @@ static const EB_U16 MaskingMatrix32x32_6[] = { M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_100, M_100, M_100, M_100, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - + M_025, M_025, M_025, M_025, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, @@ -2064,18 +2064,18 @@ static const EB_U16 MaskingMatrix32x32_6[] = { // Set0 static const EB_U16 *MaskingMatrixSet0[8][4] = { - /************************* L01_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_1 }, - /************************* L23_SETTING *************************/ - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + /************************* L01_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_1 }, + /************************* L23_SETTING *************************/ + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + /************************* L45_SETTING *************************/ + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + /************************* L67_SETTING *************************/ + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, }; // Set1 static const EB_U16 *MaskingMatrixSet1[8][4] = @@ -2087,27 +2087,27 @@ static const EB_U16 *MaskingMatrixSet1[8][4] = { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, - { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, + { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, + { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, - { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, + { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, + { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, }; // Set1 1080P static const EB_U16 *MaskingMatrix1080PSet1[8][4] = { - /************************* L01_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0}, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2}, - /************************* L23_SETTING *************************/ - { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, - { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, - /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, - { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, - /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, - { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, + /************************* L01_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0}, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2}, + /************************* L23_SETTING *************************/ + { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, + { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, + /************************* L45_SETTING *************************/ + { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, + { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, + /************************* L67_SETTING *************************/ + { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, + { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, }; // Set2 @@ -2120,28 +2120,28 @@ static const EB_U16 *MaskingMatrixSet2[8][4] = { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_5, MaskingMatrix8x8_5, MaskingMatrix16x16_5, MaskingMatrix32x32_5}, + { MaskingMatrix4x4_5, MaskingMatrix8x8_5, MaskingMatrix16x16_5, MaskingMatrix32x32_5}, { MaskingMatrix4x4_6, MaskingMatrix8x8_6, MaskingMatrix16x16_6, MaskingMatrix32x32_6 }, /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_5, MaskingMatrix8x8_5, MaskingMatrix16x16_5, MaskingMatrix32x32_5}, + { MaskingMatrix4x4_5, MaskingMatrix8x8_5, MaskingMatrix16x16_5, MaskingMatrix32x32_5}, { MaskingMatrix4x4_6, MaskingMatrix8x8_6, MaskingMatrix16x16_6, MaskingMatrix32x32_6 }, }; static const EB_U16 *MaskingMatrix1080PSet0[8][4] = { - /************************* L01_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - /************************* L23_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, - /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, + /************************* L01_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + /************************* L23_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + /************************* L45_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, + /************************* L67_SETTING *************************/ + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, }; @@ -2157,7 +2157,7 @@ void MatMult( const EB_U32 computeSize, const EB_S32 offset, const EB_S32 shiftNum, - EB_U32 *nonzerocoeff){ + EB_U32 *nonzerocoeff){ EB_U32 coeffLocation = 0; EB_U32 rowIndex, colIndex; @@ -2167,7 +2167,7 @@ void MatMult( for (rowIndex = 0; rowIndex < computeSize; ++rowIndex) { for (colIndex = 0; colIndex < computeSize; ++colIndex) { - coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex + rowIndex*maskingMatrixStride] + offset) >> shiftNum; + coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex + rowIndex*maskingMatrixStride] + offset) >> shiftNum; coeffTemp = (coeff[coeffLocation] < 0) ? -coeffTemp : coeffTemp; coeff[coeffLocation] = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp); @@ -2192,10 +2192,10 @@ void MaskTransformCoeffs( SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->ParentPcsPtr->sequenceControlSetWrapperPtr->objectPtr; EB_U8 pmpMaskingClass = (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) ? 0 : 1; depthIndex = LOG2F(areaSize) - 2; - - depthIndex = depthIndex < 4 ? depthIndex : 0; - MatMul_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + depthIndex = depthIndex < 4 ? depthIndex : 0; + + MatMul_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, &MaskingMatrix[pmpMaskingClass][pmpMaskingLevelEncDec][depthIndex][0], @@ -2210,16 +2210,16 @@ void MaskTransformCoeffs( /********************************************************************* * PerformTwoStagePm * - * First phase (non-core): three different PM candidates are determined to be evaluated in the second phase. The PM candidates are distinct in term of VQ (i.e. the susceptibility to cause VQ artifact(s)), + * First phase (non-core): three different PM candidates are determined to be evaluated in the second phase. The PM candidates are distinct in term of VQ (i.e. the susceptibility to cause VQ artifact(s)), * and in term of bitrate (i.e. the capability to save bits). The PM candidates are constructed among pre-defined sets of matrices that are derived offline. - * Second stage (core), the provided PM candidates are evaluated based on the rate distortion optimization (RDO) metric and the best candidate is selected at a 4x4 block basis. - * In this process, each TU is divided into 4x4 blocks, and each 4x4 is evaluated with up to three masking matrices provided from the first phase. - * Weighting factors are used to bias the decisions based on HVS concepts like distance from DC, temporal layer and the block mode. + * Second stage (core), the provided PM candidates are evaluated based on the rate distortion optimization (RDO) metric and the best candidate is selected at a 4x4 block basis. + * In this process, each TU is divided into 4x4 blocks, and each 4x4 is evaluated with up to three masking matrices provided from the first phase. + * Weighting factors are used to bias the decisions based on HVS concepts like distance from DC, temporal layer and the block mode. *********************************************************************/ void PerformTwoStagePm( SequenceControlSet_t *sequenceControlSetPtr, PictureControlSet_t *pictureControlSetPtr, - EncDecContext_t *contextPtr, + EncDecContext_t *contextPtr, EB_S16 *coeff, const EB_U32 coeffStride, EB_S16 *quantCoeff, @@ -2231,10 +2231,10 @@ void PerformTwoStagePm( const EB_S32 iq_offset, const EB_S32 shiftNum, EB_U32 areaSize, - const EB_U32 activeAreaSize, + const EB_U32 activeAreaSize, EB_U32 *yCountNonZeroCoeffs, - EB_U8 pmpMaskingLevelEncDec, - EB_MODETYPE type, + EB_U8 pmpMaskingLevelEncDec, + EB_MODETYPE type, EB_U32 componentType) { EbPMCand_t *pmCandBuffer = contextPtr->pmCandBuffer; @@ -2254,16 +2254,16 @@ void PerformTwoStagePm( const EB_U16 *maskingMatrixPtr = &MaskingMatrixSet1[pmpMaskingLevelEncDec][depthIndex][0]; - EB_U32 betta = 100; + EB_U32 betta = 100; - if (contextPtr->cuPtr->orgDeltaQp> 0) - { - betta = BETA_P * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); - } - else if (contextPtr->cuPtr->orgDeltaQp < 0) - { - betta = BETA_N * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); - } + if (contextPtr->cuPtr->orgDeltaQp> 0) + { + betta = BETA_P * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); + } + else if (contextPtr->cuPtr->orgDeltaQp < 0) + { + betta = BETA_N * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); + } // Use a more agressive set for 50/60 fps clips if ((sequenceControlSetPtr->staticConfig.frameRate >> 16) > 30) @@ -2278,7 +2278,7 @@ void PerformTwoStagePm( *yCountNonZeroCoeffs = 0; // Do the Quantization to avoid extra compute for areas without non zero coefficient - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, quantCoeff, @@ -2301,7 +2301,7 @@ void PerformTwoStagePm( for (colBlkIter = 0; colBlkIter < activeAreaSize / 4; ++colBlkIter) { blkOffset = colBlkIter * 4 + (rowBlkIter * 4 * coeffStride); - if ( CheckNZero4x4(&quantCoeff[blkOffset], coeffStride) ) + if ( CheckNZero4x4(&quantCoeff[blkOffset], coeffStride) ) { //Fill the PM candidates @@ -2311,225 +2311,225 @@ void PerformTwoStagePm( EB_U32 alpha = ALPHA_1000; EB_U32 matrixBlkOffset = colBlkIter * 4 + (rowBlkIter * 4 * areaSize); - if (contextPtr->pmMode == PM_MODE_0){ // 4K - MaskingMap4x4Ptr[0] = &MaskingMatrixSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - MaskingMap4x4Ptr[1] = &MaskingMatrixSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - MaskingMap4x4Ptr[2] = &maskingMatrixPtr[matrixBlkOffset]; - - pmCandBuffer[candCount++].maskingLevel = 0; - pmCandBuffer[candCount++].maskingLevel = 1; - pmCandBuffer[candCount++].maskingLevel = 2; - - switch (pmpMaskingLevelEncDec){ - case 1: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 2: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0300; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 3: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0300; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - - case 4: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 5: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 6: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 7: - - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - default: - break; - } - - } - else{ // PM_MODE_1 Sub 4K - - MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - - pmCandBuffer[candCount].maskingLevel = candCount; - candCount++; - MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - pmCandBuffer[candCount].maskingLevel = candCount; - candCount++; - - switch (pmpMaskingLevelEncDec){ - case 1: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0000; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0000; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0000; - } - break; - case 2: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 3: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0050; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - - case 4: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0050; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 5: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0200; - } - break; - case 6: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0050; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 7: - - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0200; - } - break; - default: - break; - } - } - - //to simulate chroma rate estimation bug. To embedd with above alpha setting later. - if (componentType != COMPONENT_LUMA) - alpha = alpha * 2; + if (contextPtr->pmMode == PM_MODE_0){ // 4K + MaskingMap4x4Ptr[0] = &MaskingMatrixSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + MaskingMap4x4Ptr[1] = &MaskingMatrixSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + MaskingMap4x4Ptr[2] = &maskingMatrixPtr[matrixBlkOffset]; + + pmCandBuffer[candCount++].maskingLevel = 0; + pmCandBuffer[candCount++].maskingLevel = 1; + pmCandBuffer[candCount++].maskingLevel = 2; + + switch (pmpMaskingLevelEncDec){ + case 1: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 2: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0300; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 3: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0300; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + + case 4: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 5: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 6: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 7: + + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + default: + break; + } + + } + else{ // PM_MODE_1 Sub 4K + + MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + + pmCandBuffer[candCount].maskingLevel = candCount; + candCount++; + MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + pmCandBuffer[candCount].maskingLevel = candCount; + candCount++; + + switch (pmpMaskingLevelEncDec){ + case 1: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0000; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0000; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0000; + } + break; + case 2: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 3: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0050; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + + case 4: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0050; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 5: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0200; + } + break; + case 6: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0050; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 7: + + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0200; + } + break; + default: + break; + } + } + + //to simulate chroma rate estimation bug. To embedd with above alpha setting later. + if (componentType != COMPONENT_LUMA) + alpha = alpha * 2; // Loop over candidates for (canDi = 0; canDi < candCount; canDi++) { EbPMCand_t *pmCand = &pmCandBuffer[canDi]; - - //There is Mismatch between ASM vs C ! - MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - &coeff[blkOffset], - coeffStride, - pmCand->trCoeff, - PM_STRIDE, - &MaskingMap4x4Ptr[pmCand->maskingLevel][0], - areaSize, - blkAreaSize, - (PMP_MAX >> 1), - PMP_PRECISION, - &pmCand->nzCoeff); - - // Bypass masking DC value, if it is greater than DC_TRSHLD1 - if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ - pmCand->trCoeff[0] = coeff[0]; - } - - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( + + //There is Mismatch between ASM vs C ! + MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + &coeff[blkOffset], + coeffStride, + pmCand->trCoeff, + PM_STRIDE, + &MaskingMap4x4Ptr[pmCand->maskingLevel][0], + areaSize, + blkAreaSize, + (PMP_MAX >> 1), + PMP_PRECISION, + &pmCand->nzCoeff); + + // Bypass masking DC value, if it is greater than DC_TRSHLD1 + if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ + pmCand->trCoeff[0] = coeff[0]; + } + + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( pmCand->trCoeff, PM_STRIDE, pmCand->quCoeff, @@ -2544,10 +2544,10 @@ void PerformTwoStagePm( &pmCand->nzCoeff); //Cost calculation - EB_U64 sse[2]; + EB_U64 sse[2]; EB_U64 coeffBits = 0; - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( &coeff[blkOffset], coeffStride, pmCand->iqCoeff, @@ -2560,24 +2560,24 @@ void PerformTwoStagePm( EB_U32 shift = 2 * (7 - Log2f(areaSize)); sse[DIST_CALC_RESIDUAL] = (sse[DIST_CALC_RESIDUAL] + (EB_U64)(1 << (shift - 1))) >> shift; - if (pmCand->nzCoeff) - CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( - pictureControlSetPtr->cabacCost, - NULL, - 4, - type, - 0, - 0, - pmCand->quCoeff, - PM_STRIDE, - componentType, - pmCand->nzCoeff, - &coeffBits - ); + if (pmCand->nzCoeff) + CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( + pictureControlSetPtr->cabacCost, + NULL, + 4, + type, + 0, + 0, + pmCand->quCoeff, + PM_STRIDE, + componentType, + pmCand->nzCoeff, + &coeffBits + ); pmCand->cost = GetPMCost( - (EB_U64)contextPtr->fullLambda*alpha*betta / 100 / 100, + (EB_U64)contextPtr->fullLambda*alpha*betta / 100 / 100, sse[DIST_CALC_RESIDUAL], coeffBits @@ -2603,38 +2603,38 @@ void PerformTwoStagePm( } void DecoupledQuantizeInvQuantizeLoops( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 componentType, - EB_U8 temporalLayerIndex, - EB_BOOL isUsedAsReferenceFlag, - EB_U8 chromaLambda, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 componentType, + EB_U8 temporalLayerIndex, + EB_BOOL isUsedAsReferenceFlag, + EB_U8 chromaLambda, EB_U16 qp, EB_U32 bitDepth, - CabacCost_t *CabacCost, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, + CabacCost_t *CabacCost, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, EB_RDOQ_PMCORE_TYPE useRdoType) { - EB_U32 coeffLocation = 0; - EB_U32 rowIndex, colIndex; - + EB_U32 coeffLocation = 0; + EB_U32 rowIndex, colIndex; + - EB_U32 adptive_qp_offset = q_offset; + EB_U32 adptive_qp_offset = q_offset; (void)chromaLambda; *nonzerocoeff = 0; @@ -2645,11 +2645,11 @@ void DecoupledQuantizeInvQuantizeLoops( #define RDCOST_ITERATION 3 - adptive_qp_offset = q_offset; - coeffLocation = 0; - *nonzerocoeff = 0; - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( - coeff, + adptive_qp_offset = q_offset; + coeffLocation = 0; + *nonzerocoeff = 0; + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( + coeff, coeffStride, quantCoeff, reconCoeff, @@ -2665,8 +2665,8 @@ void DecoupledQuantizeInvQuantizeLoops( EB_U64 coeffBitsLong = 0; EB_S32 rCoeffTmp, coeffTemp2; - EB_U64 rdoqBits_start = 0; - EB_BOOL first_non_zero_coef_done = EB_FALSE; + EB_U64 rdoqBits_start = 0; + EB_BOOL first_non_zero_coef_done = EB_FALSE; if (useRdoType == EB_RDOQ || useRdoType == EB_LIGHT) { @@ -2709,48 +2709,48 @@ void DecoupledQuantizeInvQuantizeLoops( coeffBitsLong = 0; - if (useRdoType == EB_LIGHT) { - if (*nonzerocoeff) { - if (!first_non_zero_coef_done) { - first_non_zero_coef_done = EB_TRUE; - - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - areaSize, - type, - intraLumaMode, - intraChromaMode, - quantCoeff, - coeffStride, - componentType, - *nonzerocoeff, - &coeffBitsLong); - rdoqBits_start = coeffBitsLong; - } - else { - coeffBitsLong = rdoqBits_start + ((rdoqBits_start * iteration * 4) / 1000); - } - } - rdoqBits[iteration] = coeffBitsLong; - } - else { - if (*nonzerocoeff) { - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - areaSize, - type, - intraLumaMode, - intraChromaMode, - quantCoeff, - coeffStride, - componentType, - *nonzerocoeff, - &coeffBitsLong); - } - rdoqBits[iteration] = coeffBitsLong; - } + if (useRdoType == EB_LIGHT) { + if (*nonzerocoeff) { + if (!first_non_zero_coef_done) { + first_non_zero_coef_done = EB_TRUE; + + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + areaSize, + type, + intraLumaMode, + intraChromaMode, + quantCoeff, + coeffStride, + componentType, + *nonzerocoeff, + &coeffBitsLong); + rdoqBits_start = coeffBitsLong; + } + else { + coeffBitsLong = rdoqBits_start + ((rdoqBits_start * iteration * 4) / 1000); + } + } + rdoqBits[iteration] = coeffBitsLong; + } + else { + if (*nonzerocoeff) { + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + areaSize, + type, + intraLumaMode, + intraChromaMode, + quantCoeff, + coeffStride, + componentType, + *nonzerocoeff, + &coeffBitsLong); + } + rdoqBits[iteration] = coeffBitsLong; + } EB_U32 shift = 2 * (7 - Log2f(areaSize)); @@ -2797,175 +2797,175 @@ void DecoupledQuantizeInvQuantizeLoops( } else - if (useRdoType == EB_PMCORE){ - if (*nonzerocoeff && (componentType == COMPONENT_LUMA)){ - + if (useRdoType == EB_PMCORE){ + if (*nonzerocoeff && (componentType == COMPONENT_LUMA)){ + #define NUM_PM_CANDIDATE 3 - - EB_U8 canDi; - EB_U8 candCount = 0; - EB_U64 bestCost = MAX_CU_COST; - EB_U32 bestCand = 0; - EB_U32 blkAreaSize = 4; - EB_U8 sampleIndex; - EB_U32 activeAreaSize = areaSize; - - EB_U32 depthIndex = LOG2F(areaSize) - 2; - depthIndex = depthIndex < 4 ? depthIndex : 0; - - // Initialize maskingMatrixPtr - const EB_U16 *MaskingMap4x4Ptr[NUM_PM_CANDIDATE]; - EbPMCand_t pmCandBuffer[NUM_PM_CANDIDATE]; - - - EB_U32 colBlkIter, rowBlkIter, blkOffset; - - *nonzerocoeff = 0; - // Loop over 4x4 blocks within each TU - for (rowBlkIter = 0; rowBlkIter < activeAreaSize / 4; ++rowBlkIter) { - for (colBlkIter = 0; colBlkIter < activeAreaSize / 4; ++colBlkIter) { - blkOffset = colBlkIter * 4 + (rowBlkIter * 4 * coeffStride); - - if (CheckNZero4x4(&quantCoeff[blkOffset], coeffStride)) - - { - //Fill the PM candidates - candCount = 0; - bestCost = MAX_CU_COST; - bestCand = 0; - - MaskingMap4x4Ptr[0] = &MaskingMatrix4x4_100[0]; - MaskingMap4x4Ptr[1] = &MaskingMatrix4x4_70[0]; - MaskingMap4x4Ptr[2] = &MaskingMatrix4x4_50[0]; - - pmCandBuffer[candCount++].maskingLevel = 0; - pmCandBuffer[candCount++].maskingLevel = 1; - pmCandBuffer[candCount++].maskingLevel = 2; - - - - // Loop over candidates - for (canDi = 0; canDi < candCount; canDi++) - { - - EbPMCand_t *pmCand = &pmCandBuffer[canDi]; - - //There is Mismatch between ASM vs C ! - MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - &coeff[blkOffset], - coeffStride, - pmCand->trCoeff, - PM_STRIDE, - &MaskingMap4x4Ptr[pmCand->maskingLevel][0], - PM_STRIDE, - blkAreaSize, - (PMP_MAX >> 1), - PMP_PRECISION, - &pmCand->nzCoeff); - - // Bypass masking DC value, if it is greater than DC_TRSHLD1 - if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ - pmCand->trCoeff[0] = coeff[0]; - } - - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( - pmCand->trCoeff, - PM_STRIDE, - pmCand->quCoeff, - pmCand->iqCoeff, - qFunc, - adptive_qp_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - blkAreaSize, - &pmCand->nzCoeff); - - //Cost calculation - EB_U64 sse[2]; - EB_U64 coeffBits = 0; - - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( - &coeff[blkOffset], - coeffStride, - pmCand->iqCoeff, - PM_STRIDE, - sse, - blkAreaSize, - blkAreaSize); - - - EB_U32 shift = 2 * (7 - Log2f(areaSize)); - sse[DIST_CALC_RESIDUAL] = (sse[DIST_CALC_RESIDUAL] + (EB_U64)(1 << (shift - 1))) >> shift; - - if (pmCand->nzCoeff) - CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( - CabacCost, - NULL, - 4, - type, - 0, - 0, - pmCand->quCoeff, - PM_STRIDE, - componentType, - pmCand->nzCoeff, - &coeffBits - ); - - if (componentType == COMPONENT_CHROMA){ - - if (temporalLayerIndex == 0) { - sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else if (isUsedAsReferenceFlag) { - sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - - pmCand->cost = sse[DIST_CALC_RESIDUAL] + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); - } else { - pmCand->cost = (sse[DIST_CALC_RESIDUAL] << COST_PRECISION) + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); - } - - - //determine best cost - if (pmCand->cost < bestCost){ - bestCost = pmCand->cost; - bestCand = canDi; - } - } - //overwrite regular path with best - EbPMCand_t *pmBestCand = &pmCandBuffer[bestCand]; - for (sampleIndex = 0; sampleIndex < blkAreaSize; sampleIndex++){ - EB_MEMCPY(&quantCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->quCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); - EB_MEMCPY(&reconCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->iqCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); - } - *nonzerocoeff += pmBestCand->nzCoeff; - } - } - } - } + + EB_U8 canDi; + EB_U8 candCount = 0; + EB_U64 bestCost = MAX_CU_COST; + EB_U32 bestCand = 0; + EB_U32 blkAreaSize = 4; + EB_U8 sampleIndex; + EB_U32 activeAreaSize = areaSize; + + EB_U32 depthIndex = LOG2F(areaSize) - 2; + depthIndex = depthIndex < 4 ? depthIndex : 0; + + // Initialize maskingMatrixPtr + const EB_U16 *MaskingMap4x4Ptr[NUM_PM_CANDIDATE]; + EbPMCand_t pmCandBuffer[NUM_PM_CANDIDATE]; + + + EB_U32 colBlkIter, rowBlkIter, blkOffset; + + *nonzerocoeff = 0; + // Loop over 4x4 blocks within each TU + for (rowBlkIter = 0; rowBlkIter < activeAreaSize / 4; ++rowBlkIter) { + for (colBlkIter = 0; colBlkIter < activeAreaSize / 4; ++colBlkIter) { + blkOffset = colBlkIter * 4 + (rowBlkIter * 4 * coeffStride); + + if (CheckNZero4x4(&quantCoeff[blkOffset], coeffStride)) + + { + //Fill the PM candidates + candCount = 0; + bestCost = MAX_CU_COST; + bestCand = 0; + + MaskingMap4x4Ptr[0] = &MaskingMatrix4x4_100[0]; + MaskingMap4x4Ptr[1] = &MaskingMatrix4x4_70[0]; + MaskingMap4x4Ptr[2] = &MaskingMatrix4x4_50[0]; + + pmCandBuffer[candCount++].maskingLevel = 0; + pmCandBuffer[candCount++].maskingLevel = 1; + pmCandBuffer[candCount++].maskingLevel = 2; + + + + // Loop over candidates + for (canDi = 0; canDi < candCount; canDi++) + { + + EbPMCand_t *pmCand = &pmCandBuffer[canDi]; + + //There is Mismatch between ASM vs C ! + MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + &coeff[blkOffset], + coeffStride, + pmCand->trCoeff, + PM_STRIDE, + &MaskingMap4x4Ptr[pmCand->maskingLevel][0], + PM_STRIDE, + blkAreaSize, + (PMP_MAX >> 1), + PMP_PRECISION, + &pmCand->nzCoeff); + + // Bypass masking DC value, if it is greater than DC_TRSHLD1 + if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ + pmCand->trCoeff[0] = coeff[0]; + } + + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( + pmCand->trCoeff, + PM_STRIDE, + pmCand->quCoeff, + pmCand->iqCoeff, + qFunc, + adptive_qp_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + blkAreaSize, + &pmCand->nzCoeff); + + //Cost calculation + EB_U64 sse[2]; + EB_U64 coeffBits = 0; + + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( + &coeff[blkOffset], + coeffStride, + pmCand->iqCoeff, + PM_STRIDE, + sse, + blkAreaSize, + blkAreaSize); + + + EB_U32 shift = 2 * (7 - Log2f(areaSize)); + sse[DIST_CALC_RESIDUAL] = (sse[DIST_CALC_RESIDUAL] + (EB_U64)(1 << (shift - 1))) >> shift; + + if (pmCand->nzCoeff) + CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( + CabacCost, + NULL, + 4, + type, + 0, + 0, + pmCand->quCoeff, + PM_STRIDE, + componentType, + pmCand->nzCoeff, + &coeffBits + ); + + if (componentType == COMPONENT_CHROMA){ + + if (temporalLayerIndex == 0) { + sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else if (isUsedAsReferenceFlag) { + sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + + pmCand->cost = sse[DIST_CALC_RESIDUAL] + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); + } else { + pmCand->cost = (sse[DIST_CALC_RESIDUAL] << COST_PRECISION) + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); + } + + + //determine best cost + if (pmCand->cost < bestCost){ + bestCost = pmCand->cost; + bestCand = canDi; + } + } + //overwrite regular path with best + EbPMCand_t *pmBestCand = &pmCandBuffer[bestCand]; + for (sampleIndex = 0; sampleIndex < blkAreaSize; sampleIndex++){ + EB_MEMCPY(&quantCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->quCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); + EB_MEMCPY(&reconCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->iqCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); + } + *nonzerocoeff += pmBestCand->nzCoeff; + } + } + } + } } - coeffLocation = 0; - for (rowIndex = 0; rowIndex < areaSize; ++rowIndex) { - for (colIndex = 0; colIndex < areaSize; ++colIndex) { + coeffLocation = 0; + for (rowIndex = 0; rowIndex < areaSize; ++rowIndex) { + for (colIndex = 0; colIndex < areaSize; ++colIndex) { - //iQ - //coeffTemp = ( (CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, quantCoeff[quantLocation]) * shiftedFFunc) + iq_offset) >> shiftNum; - coeffTemp2 = ((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - rCoeffTmp = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp2); - reconCoeff[coeffLocation] = (EB_S16)rCoeffTmp; + //iQ + //coeffTemp = ( (CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, quantCoeff[quantLocation]) * shiftedFFunc) + iq_offset) >> shiftNum; + coeffTemp2 = ((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + rCoeffTmp = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp2); + reconCoeff[coeffLocation] = (EB_S16)rCoeffTmp; - ++coeffLocation; - } - coeffLocation += coeffStride - areaSize; - } + ++coeffLocation; + } + coeffLocation += coeffStride - areaSize; + } } @@ -2976,83 +2976,83 @@ void DecoupledQuantizeInvQuantizeLoops( * Unified Quant +iQuant *********************************************************************/ void UnifiedQuantizeInvQuantize( - EncDecContext_t *contextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 bitDepth, - EB_U32 areaSize, - EB_PICTURE sliceType, - EB_U32 *yCountNonZeroCoeffs, - EB_U8 transCoeffShape, - EB_U8 cleanSparseCeoffPfEncDec, - EB_U8 pmpMaskingLevelEncDec, - EB_MODETYPE type, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag, - EB_U32 componentType, - EB_U32 temporalLayerIndex, - EB_U32 dZoffset, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost) + EncDecContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 bitDepth, + EB_U32 areaSize, + EB_PICTURE sliceType, + EB_U32 *yCountNonZeroCoeffs, + EB_U8 transCoeffShape, + EB_U8 cleanSparseCeoffPfEncDec, + EB_U8 pmpMaskingLevelEncDec, + EB_MODETYPE type, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag, + EB_U32 componentType, + EB_U32 temporalLayerIndex, + EB_U32 dZoffset, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost) { SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->ParentPcsPtr->sequenceControlSetWrapperPtr->objectPtr; - if (contextPtr->mdContext->rdoqPmCoreMethod){ - - //for the Quant - const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 - const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) - const EB_U32 qFunc = QFunc[qpRem]; // 15 bits - - const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit - - const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); - const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; - const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); - - //for the iQuant - const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT - const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; - const EB_S32 iq_offset = 1 << (shiftNum - 1); - - DecoupledQuantizeInvQuantizeLoops( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - cabacEncodeCtxPtr, - lambda, - type, - intraLumaMode, - intraChromaMode, - componentType, - pictureControlSetPtr->temporalLayerIndex, - pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, + if (contextPtr->mdContext->rdoqPmCoreMethod){ + + //for the Quant + const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 + const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) + const EB_U32 qFunc = QFunc[qpRem]; // 15 bits + + const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit + + const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); + const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; + const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); + + //for the iQuant + const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT + const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; + const EB_S32 iq_offset = 1 << (shiftNum - 1); + + DecoupledQuantizeInvQuantizeLoops( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + cabacEncodeCtxPtr, + lambda, + type, + intraLumaMode, + intraChromaMode, + componentType, + pictureControlSetPtr->temporalLayerIndex, + pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, (EB_U8)contextPtr->fullChromaLambda, - (EB_U16)qp, + (EB_U16)qp, bitDepth, - CabacCost, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), + CabacCost, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), contextPtr->mdContext->rdoqPmCoreMethod); - } - else if (transCoeffShape == ONLY_DC_SHAPE) { + } + else if (transCoeffShape == ONLY_DC_SHAPE) { // Quant const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 @@ -3121,8 +3121,8 @@ void UnifiedQuantizeInvQuantize( EB_U32 activeAreaSize = areaSize >> transCoeffShape; - if (contextPtr->pmMethod && componentType != COMPONENT_LUMA) { - + if (contextPtr->pmMethod && componentType != COMPONENT_LUMA) { + if (pmpMaskingLevelEncDec) { MaskTransformCoeffs( @@ -3134,9 +3134,9 @@ void UnifiedQuantizeInvQuantize( pictureControlSetPtr, &(*yCountNonZeroCoeffs)); } - //QiQ SSSE3 is hardcoded - //QiQ Use this for SW - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + //QiQ SSSE3 is hardcoded + //QiQ Use this for SW + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, quantCoeff, @@ -3177,7 +3177,7 @@ void UnifiedQuantizeInvQuantize( } else { - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, quantCoeff, @@ -3257,7 +3257,7 @@ void UnifiedQuantizeInvQuantize( enableCbflag, enableContouringQCUpdateFlag); } - } + } } /********************************************************************* @@ -3282,7 +3282,7 @@ EB_ERRORTYPE EstimateTransform( EB_U32 transformSizeFlag = Log2f(TRANSFORM_MAX_SIZE) - Log2f(transformSize); if (transCoeffShape == DEFAULT_SHAPE) { - (*transformFunctionTableEstimate[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( + (*transformFunctionTableEstimate[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( residualBuffer, residualStride, coeffBuffer, @@ -3294,7 +3294,7 @@ EB_ERRORTYPE EstimateTransform( else if (transCoeffShape == N2_SHAPE) { - (*PfreqN2TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( + (*PfreqN2TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( residualBuffer, residualStride, coeffBuffer, @@ -3305,7 +3305,7 @@ EB_ERRORTYPE EstimateTransform( else if (transCoeffShape == N4_SHAPE) { - (*PfreqN4TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( + (*PfreqN4TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( residualBuffer, residualStride, coeffBuffer, @@ -3317,7 +3317,7 @@ EB_ERRORTYPE EstimateTransform( EB_S32 sumResidual; - sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( residualBuffer, transformSize, residualStride); @@ -3426,7 +3426,7 @@ EB_ERRORTYPE EncodeTransform( EB_S32 sumResidual; - sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( residualBuffer, transformSize, residualStride); @@ -3436,7 +3436,7 @@ EB_ERRORTYPE EncodeTransform( EB_U32 shift2nd = Log2f(transformSize) + 6; EB_S32 offset2nd = 1 << (shift2nd - 1); - + EB_S16 dcCoeff; EB_S32 dcCoeffTemp; dcCoeffTemp = (EB_S32)((64 * sumResidual + offset1st) >> shift1st); @@ -3472,7 +3472,7 @@ EB_ERRORTYPE EstimateInvTransform( // but in order to avoid extra copying, it is overwritten in place. The // input(residualBuffer) is the LCU residual buffer if (partialFrequencyN2Flag == EB_FALSE) { - (*invTransformFunctionTableEstimate[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( + (*invTransformFunctionTableEstimate[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( coeffBuffer, coeffStride, reconBuffer, @@ -3519,20 +3519,20 @@ EB_ERRORTYPE EncodeInvTransform( EB_U32 shift1st = SHIFT_INV_1ST; EB_U32 shift2nd = SHIFT_INV_2ND - bitIncrement; - + EB_S32 offset1st = 1 << (shift1st - 1); EB_S32 offset2nd = 1 << (shift2nd - 1); EB_S16 invTranformedDcCoef; - + invTranformedDcCoef = (EB_S16) CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM,((64 * dcCoef + offset1st) >> shift1st)); invTranformedDcCoef = (EB_S16) CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM,((64 * invTranformedDcCoef + offset2nd) >> shift2nd)); - memset16bitBlock_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + memset16bitBlock_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( reconBuffer, reconStride, transformSize, - invTranformedDcCoef); + invTranformedDcCoef); } else @@ -3542,7 +3542,7 @@ EB_ERRORTYPE EncodeInvTransform( // The input of this function is the quantized_inversequantized transformed residual // but in order to avoid extra copying, it is overwritten in place. The // input(residualBuffer) is the LCU residual buffer - (*invTransformFunctionTableEncode[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( + (*invTransformFunctionTableEncode[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( coeffBuffer, coeffStride, reconBuffer, diff --git a/Source/Lib/Codec/EbTransforms.h b/Source/Lib/Codec/EbTransforms.h index eb30f4747..aebb3ad53 100644 --- a/Source/Lib/Codec/EbTransforms.h +++ b/Source/Lib/Codec/EbTransforms.h @@ -23,35 +23,35 @@ extern "C" { #endif -static const EB_U32 QFunc[] = {26214,23302,20560,18396,16384,14564}; +static const EB_U32 QFunc[] = {26214,23302,20560,18396,16384,14564}; static const EB_U32 FFunc[] = {40,45,51,57,64,72}; //QP in [0..63] static const EB_U8 QpModSix[]= { - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, 0, 1, 2, 3 }; static const EB_U8 QpDivSix[]= { - 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, + 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10,10 @@ -87,34 +87,34 @@ extern EB_ERRORTYPE InvQuantize( extern void UnifiedQuantizeInvQuantize( - EncDecContext_t *contextPtr, - - PictureControlSet_t *pictureControlSetPtr, - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 bitDepth, - EB_U32 areaSize, - EB_PICTURE sliceType, - EB_U32 *yCountNonZeroCoeffs, - EB_TRANS_COEFF_SHAPE transCoeffShape, - - EB_U8 cleanSparseCeoffPfEncDec, - EB_U8 pmpMaskingLevelEncDec, - EB_MODETYPE type, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag, - EB_U32 componentType, - EB_U32 temporalLayerIndex, - EB_U32 dZoffset, - - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost); + EncDecContext_t *contextPtr, + + PictureControlSet_t *pictureControlSetPtr, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 bitDepth, + EB_U32 areaSize, + EB_PICTURE sliceType, + EB_U32 *yCountNonZeroCoeffs, + EB_TRANS_COEFF_SHAPE transCoeffShape, + + EB_U8 cleanSparseCeoffPfEncDec, + EB_U8 pmpMaskingLevelEncDec, + EB_MODETYPE type, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag, + EB_U32 componentType, + EB_U32 temporalLayerIndex, + EB_U32 dZoffset, + + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost); extern EB_ERRORTYPE EncodeTransform( @@ -129,14 +129,14 @@ extern EB_ERRORTYPE EncodeTransform( EB_TRANS_COEFF_SHAPE transCoeffShape); extern EB_ERRORTYPE EstimateTransform( - EB_S16 *residualBuffer, - EB_U32 residualStride, - EB_S16 *coeffBuffer, - EB_U32 coeffStride, - EB_U32 transformSize, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement, - EB_BOOL dstTansformFlag, + EB_S16 *residualBuffer, + EB_U32 residualStride, + EB_S16 *coeffBuffer, + EB_U32 coeffStride, + EB_U32 transformSize, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement, + EB_BOOL dstTansformFlag, EB_TRANS_COEFF_SHAPE transCoeffShape); @@ -152,7 +152,7 @@ extern EB_ERRORTYPE EstimateInvTransform( EB_U32 partialFrequencyN2Flag); extern EB_ERRORTYPE EncodeInvTransform( - EB_BOOL isOnlyDc, + EB_BOOL isOnlyDc, EB_S16 *coeffBuffer, EB_U32 coeffStride, EB_S16 *reconBuffer, @@ -169,36 +169,36 @@ extern EB_ERRORTYPE CalculateCbf( EB_U32 transformSize, EB_U32 *cbfBuffer); extern EB_U8 MapChromaQp( - EB_U8 qp - ); + EB_U8 qp + ); extern void DecoupledQuantizeInvQuantizeLoops( EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 componentType, - EB_U8 temporalLayerIndex, - EB_BOOL isUsedAsReferenceFlag, - EB_U8 chromaLambda, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 componentType, + EB_U8 temporalLayerIndex, + EB_BOOL isUsedAsReferenceFlag, + EB_U8 chromaLambda, EB_U16 qp, EB_U32 bitDepth, - CabacCost_t *CabacCost, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, + CabacCost_t *CabacCost, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, EB_RDOQ_PMCORE_TYPE rdoType); @@ -222,7 +222,7 @@ typedef void(*EB_QIQ_TYPE)( const EB_S32 iq_offset, const EB_S32 shiftNum, const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); typedef void(*EB_MAT_MUL_TYPE)( EB_S16 *coeff, @@ -232,7 +232,7 @@ typedef void(*EB_MAT_MUL_TYPE)( const EB_U32 computeSize, const EB_S32 offset, const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); extern void MatMult( EB_S16 *coeff, @@ -242,36 +242,36 @@ extern void MatMult( const EB_U32 computeSize, const EB_S32 offset, const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); typedef void(*EB_MAT_OUT_MUL_TYPE)( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32 *nonzerocoeff); void MatMultOut( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32 *nonzerocoeff); static EB_MAT_OUT_MUL_TYPE FUNC_TABLE MatMulOut_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - MatMultOut, - MatMult4x4_OutBuff_AVX2_INTRIN, + MatMultOut, + MatMult4x4_OutBuff_AVX2_INTRIN, }; @@ -296,23 +296,23 @@ typedef void(*EB_INVTRANSFORM_FUNC)( * Function Tables *****************************/ static EB_QIQ_TYPE FUNC_TABLE QiQ_funcPtrArray[EB_ASM_TYPE_TOTAL][5] = { - // C_DEFAULT - { + // C_DEFAULT + { /*0 4x4 */ QuantizeInvQuantize, /*1 8x8 */ QuantizeInvQuantize, /*2 16x16 */ QuantizeInvQuantize, /*3 */ (EB_QIQ_TYPE)QiQVoidFunc, /*4 32x32 */ QuantizeInvQuantize - }, - // AVX2 - { - /*0 4x4 */ QuantizeInvQuantize4x4_SSE3, - /*1 8x8 */ QuantizeInvQuantize8x8_AVX2_INTRIN, - /*2 16x16 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, - /*3 */ (EB_QIQ_TYPE)QiQVoidFunc, - /*4 32x32 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, - - }, + }, + // AVX2 + { + /*0 4x4 */ QuantizeInvQuantize4x4_SSE3, + /*1 8x8 */ QuantizeInvQuantize8x8_AVX2_INTRIN, + /*2 16x16 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, + /*3 */ (EB_QIQ_TYPE)QiQVoidFunc, + /*4 32x32 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, + + }, }; static EB_MAT_MUL_TYPE FUNC_TABLE MatMul_funcPtrArray[EB_ASM_TYPE_TOTAL][5] = { @@ -339,8 +339,8 @@ static EB_MAT_MUL_TYPE FUNC_TABLE MatMul_funcPtrArray[EB_ASM_TYPE_TOTAL][5] = { static const EB_TRANSFORM_FUNC transformFunctionTableEstimate[EB_ASM_TYPE_TOTAL][5] = { // C_DEFAULT { - Transform32x32Estimate, - Transform16x16Estimate, + Transform32x32Estimate, + Transform16x16Estimate, Transform8x8, Transform4x4, DstTransform4x4 diff --git a/Source/Lib/Codec/EbUtility.c b/Source/Lib/Codec/EbUtility.c index f4f651286..08ece68e0 100644 --- a/Source/Lib/Codec/EbUtility.c +++ b/Source/Lib/Codec/EbUtility.c @@ -236,35 +236,35 @@ const CodedUnitStats_t* GetCodedUnitStats(const EB_U32 cuIdx) } static const TransformUnitStats_t TransformUnitStatsArray[] = { - // - // depth - // / - // / offsetX (units of the current depth) - // / / - // / / offsetY (units of the current depth) - // / / / - {0, 0, 0}, // 0 - {1, 0, 0}, // 1 - {1, 2, 0}, // 2 - {1, 0, 2}, // 3 - {1, 2, 2}, // 4 - {2, 0, 0}, // 5 - {2, 1, 0}, // 6 - {2, 0, 1}, // 7 - {2, 1, 1}, // 8 - {2, 2, 0}, // 9 - {2, 3, 0}, // 10 - {2, 2, 1}, // 11 - {2, 3, 1}, // 12 - { 2, 0, 2}, // 13 - { 2, 1, 2}, // 14 - { 2, 0, 3}, // 15 - { 2, 1, 3}, // 16 - { 2, 2, 2}, // 17 - { 2, 3, 2}, // 18 - { 2, 2, 3}, // 19 - { 2, 3, 3}, // 20 - {0xFF, 0xFF, 0xFF} // Invalid + // + // depth + // / + // / offsetX (units of the current depth) + // / / + // / / offsetY (units of the current depth) + // / / / + {0, 0, 0}, // 0 + {1, 0, 0}, // 1 + {1, 2, 0}, // 2 + {1, 0, 2}, // 3 + {1, 2, 2}, // 4 + {2, 0, 0}, // 5 + {2, 1, 0}, // 6 + {2, 0, 1}, // 7 + {2, 1, 1}, // 8 + {2, 2, 0}, // 9 + {2, 3, 0}, // 10 + {2, 2, 1}, // 11 + {2, 3, 1}, // 12 + { 2, 0, 2}, // 13 + { 2, 1, 2}, // 14 + { 2, 0, 3}, // 15 + { 2, 1, 3}, // 16 + { 2, 2, 2}, // 17 + { 2, 3, 2}, // 18 + { 2, 2, 3}, // 19 + { 2, 3, 3}, // 20 + {0xFF, 0xFF, 0xFF} // Invalid }; /************************************************************** @@ -352,22 +352,22 @@ EB_U64 Log2fHighPrecision(EB_U64 x, EB_U8 precision) static const MiniGopStats_t MiniGopStatsArray[] = { - // HierarchicalLevels StartIndex EndIndex Lenght miniGopIndex - { 5, 0, 31, 32 }, // 0 - { 4, 0, 15, 16 }, // 1 - { 3, 0, 7, 8 }, // 2 - { 2, 0, 3, 4 }, // 3 - { 2, 4, 7, 4 }, // 4 - { 3, 8, 15, 8 }, // 5 - { 2, 8, 11, 4 }, // 6 - { 2, 12, 15, 4 }, // 7 - { 4, 16, 31, 16 }, // 8 - { 3, 16, 23, 8 }, // 9 - { 2, 16, 19, 4 }, // 10 - { 2, 20, 23, 4 }, // 11 - { 3, 24, 31, 8 }, // 12 - { 2, 24, 27, 4 }, // 13 - { 2, 28, 31, 4 } // 14 + // HierarchicalLevels StartIndex EndIndex Lenght miniGopIndex + { 5, 0, 31, 32 }, // 0 + { 4, 0, 15, 16 }, // 1 + { 3, 0, 7, 8 }, // 2 + { 2, 0, 3, 4 }, // 3 + { 2, 4, 7, 4 }, // 4 + { 3, 8, 15, 8 }, // 5 + { 2, 8, 11, 4 }, // 6 + { 2, 12, 15, 4 }, // 7 + { 4, 16, 31, 16 }, // 8 + { 3, 16, 23, 8 }, // 9 + { 2, 16, 19, 4 }, // 10 + { 2, 20, 23, 4 }, // 11 + { 3, 24, 31, 8 }, // 12 + { 2, 24, 27, 4 }, // 13 + { 2, 28, 31, 4 } // 14 }; /************************************************************** diff --git a/Tests/README.md b/Tests/README.md index 6cff5b115..94ebcac80 100644 --- a/Tests/README.md +++ b/Tests/README.md @@ -3,7 +3,7 @@ ### Python The test script is written in Python. Supported Python versions include 2.7 and 3.7 - + ### Operating Systems @@ -21,7 +21,7 @@ TOOLS_PATH = folder where the tools are located (e.g. reference decoder) - defau These folders should be created prior to running the script.\ The bitstream folder should be empty and cleared for each run.\ Note: You should build the SVT encoder and place the executable in the folder specified under "ENC_PATH"\ -Note: Download the reference decoder from https://hevc.hhi.fraunhofer.de/ and place in the folder specified under "TOOLS_PATH"\ +Note: Download the reference decoder from https://hevc.hhi.fraunhofer.de/ and place in the folder specified under "TOOLS_PATH"\ @@ -42,17 +42,17 @@ QP_VBR_MODE defines how the quantization parameter and variable bitrate paramete 0 = Both QP and VBR parameters are used\ 1 = Only QP parameter is used\ 2 = Only VBR parameter is used\ - + ### Encoder Modes SPEED_ENC_MODES is a list variable that defines which encoding modes (0-11) are used in the tests. It defaults to [0,6,9] - + ### Number of Frames NUM_FRAMES is a variable that defines the number of frames encoded in each test. It default to 20 - + ### Quantization Iterations @@ -73,17 +73,17 @@ MIN_BR defaults to 1000\ MAX_BR defaults to 10000000\ VBR_ITERATIONS defaults to 1 for fast and nightly test modes, and 2 for full test modes\ VBR iteration is only used when VBR parameter is being used\ - + ### Search Area Iterations SA_ITER defines the size of the search area used in the tests - + ### Look Ahead Distance Iterations LAD_ITER defines the number of intra-periods are used in the tests - + ### Width Height @@ -108,7 +108,7 @@ TEST_CONFIGURATION can be set to 0 or 1\ Both set of tests use different set of media files (VALIDATION_TEST_SEQUENCES and SPEED_TEST_SEQUENCES). -Validation tests tabulate sums of the number of test that are run and the +Validation tests tabulate sums of the number of test that are run and the number of tests that pass. The total time taken to run the full set of tests is calculated. @@ -118,7 +118,7 @@ which can executed outside of this batch file. ### Adding a validation test Here are the basic steps to follow when adding a test to validate the correct processing of an encoder parameter. You can refer to existing tests functions (e.g. sao_test) for reference on creating a new test function.\ - + 1. Add a function that runs a test at the bottom of the section labeled FUNCTIONAL TESTS.\ @@ -147,10 +147,10 @@ Here are the basic steps to follow when adding a test to validate the correct pr ``` combination_test_params = { 'MyParameterName' : [0, 1], 'MyOtherParameterName' : [0, 1], - } + } ``` - - make sure that all parameters used in the dictionary are also included in the default_tokens dictionary created in the get_param_tokens function (e.g.)\ + - make sure that all parameters used in the dictionary are also included in the default_tokens dictionary created in the get_param_tokens function (e.g.)\ ``` default_tokens = { @@ -160,13 +160,13 @@ Here are the basic steps to follow when adding a test to validate the correct pr ... ``` - - Add a return statement to the function which calls run_functional_tests passing the sequence list, test name, and test parameters (e.g.)\ + - Add a return statement to the function which calls run_functional_tests passing the sequence list, test name, and test parameters (e.g.)\ ``` return self.run_functional_tests(seq_list, test_name, combination_test_params) ``` - - Here's the resulting function:\ + - Here's the resulting function:\ ``` def myparameter_test(self,seq_list){ @@ -189,7 +189,7 @@ Here are the basic steps to follow when adding a test to validate the correct pr 3. Try running the script in debug mode. There should be a txt file with a name based on your test name (e.g. myparameter_test.txt). Open the text file and verify that the individual tests run match with the parameters you've specified in your function.\ - + ### How to use the test script: @@ -204,4 +204,4 @@ Here are the basic steps to follow when adding a test to validate the correct pr python SVT-HEVC_FunctionalTests.py Fast python SVT-HEVC_FunctionalTests.py Nightly python SVT-HEVC_FunctionalTests.py Full -``` \ No newline at end of file +``` diff --git a/ffmpeg_plugin/README.txt b/ffmpeg_plugin/README.txt index ad13ffc8a..d07652abe 100644 --- a/ffmpeg_plugin/README.txt +++ b/ffmpeg_plugin/README.txt @@ -1,6 +1,6 @@ # svt-hevc ffmpeg plugin installation -1. Build and install SVT-HEVC +1. Build and install SVT-HEVC - git clone https://github.com/OpenVisualCloud/SVT-HEVC - cd SVT-HEVC/Build/linux - ./build.sh debug|release @@ -19,6 +19,6 @@ - make -j `nproc` 3. Verify ->> ffmpeg is now built with svt-hevc, sample command line: +>> ffmpeg is now built with svt-hevc, sample command line: ./ffmpeg -i input.mp4 -c:v libsvt_hevc -rc 1 -b:v 10M -tune 0 -preset 9 -y test.265 ./ffmpeg -i input.mp4 -c:v libsvt_hevc -vframes 1000 -y test.mp4 diff --git a/gstreamer-plugin/README.md b/gstreamer-plugin/README.md index 9702379a8..49fd5ebe6 100644 --- a/gstreamer-plugin/README.md +++ b/gstreamer-plugin/README.md @@ -1,19 +1,19 @@ # GStreamer-SVT-HEVC ## Overview -This plugin provides svthevcenc element to GStreamer in order to use the Scalable Video Technology for HEVC Encoder ([SVT-HEVC](https://github.com/intel/SVT-HEVC)). +This plugin provides svthevcenc element to GStreamer in order to use the Scalable Video Technology for HEVC Encoder ([SVT-HEVC](https://github.com/intel/SVT-HEVC)). ## Requirements * GStreamer 1.8 or later * Scalable Video Technology for HEVC Encoder ([SVT-HEVC](https://github.com/intel/SVT-HEVC)) 1.3.0 or later - * SvtHevcEnc.dll or libSvtHevcEnc.so has to be in the PATH or next to the plugin's DLL/.so. + * SvtHevcEnc.dll or libSvtHevcEnc.so has to be in the PATH or next to the plugin's DLL/.so. * Windows or Linux operating system * A 64-bit CPU with AVX2 support ## Usage Make sure that the SvtHevcEnc library is in a path the OS looks for when loading dynamic libraries. If using default install locations, this means for example: - export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # Linux - set PATH=C:\svt-encoders\lib;%PATH% # Windows + export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # Linux + set PATH=C:\svt-encoders\lib;%PATH% # Windows Then a sample GStreamer pipeline is: @@ -24,24 +24,24 @@ If you're not familiar with GStreamer, gst-launch-1.0 is part of GStreamer tools ## Compiling and Installing ### Build Dependencies * GStreamer and GStreamer-plugins-base dev 1.8 or later - * on Debian/Ubuntu: `apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev` - * on Windows: [gstreamer-1.0-devel-x86_64-*.msi](https://gstreamer.freedesktop.org/data/pkg/windows/) + * on Debian/Ubuntu: `apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev` + * on Windows: [gstreamer-1.0-devel-x86_64-*.msi](https://gstreamer.freedesktop.org/data/pkg/windows/) * Scalable Video Technology for HEVC Encoder ([SVT-HEVC](https://github.com/intel/SVT-HEVC)) 1.3.0 or later * meson 0.29 or later - * install python3 and run `pip3 install meson` + * install python3 and run `pip3 install meson` * pkg-config - * on Debian/Ubuntu: `apt-get install pkg-config` - * on Windows, we recommend [pkgconfiglite](https://sourceforge.net/projects/pkgconfiglite/) + * on Debian/Ubuntu: `apt-get install pkg-config` + * on Windows, we recommend [pkgconfiglite](https://sourceforge.net/projects/pkgconfiglite/) * *(optional on Windows)* ninja - * install python3 and run `pip3 install ninja` - * or on Ubuntu: `apt install ninja-build` + * install python3 and run `pip3 install ninja` + * or on Ubuntu: `apt install ninja-build` -This plugin uses `meson` build tools and the dependency on SVT-HEVC library is set-up using `pkg-config`. +This plugin uses `meson` build tools and the dependency on SVT-HEVC library is set-up using `pkg-config`. ### Linux specific instructions Make sure first that SVT-HEVC library is installed and can be found using pkg-config. You can do that using CMake: - cmake -P SVT-HEVC/Build/linux/release/Source/Lib/cmake_install.cmake + cmake -P SVT-HEVC/Build/linux/release/Source/Lib/cmake_install.cmake Then you can compile and install the plugin the following way: @@ -50,7 +50,7 @@ Then you can compile and install the plugin the following way: ### Windows specific instructions Make sure first that SVT-HEVC library is installed and can be found using pkg-config. You can do that using CMake: - cmake -P SVT-HEVC\Build\Windows\Source\Lib\cmake_install.cmake + cmake -P SVT-HEVC\Build\Windows\Source\Lib\cmake_install.cmake The following commands should be run from a Visual Studio command prompt or another build environment like MinGW, not Windows built-in command prompt. @@ -60,8 +60,8 @@ Specify the path to pkgconfig configuration files for GStreamer and SVT-HEVC, an Then the plugin can be compiled and installed using Ninja: - meson -Dprefix=%GSTREAMER_1_0_ROOT_X86_64% build && ninja -C build && ninja -C build install + meson -Dprefix=%GSTREAMER_1_0_ROOT_X86_64% build && ninja -C build && ninja -C build install Or made available as a Visual Studio project: - meson -Dprefix=%GSTREAMER_1_0_ROOT_X86_64% build --backend=vs2017 + meson -Dprefix=%GSTREAMER_1_0_ROOT_X86_64% build --backend=vs2017 diff --git a/gstreamer-plugin/git-patch/README.txt b/gstreamer-plugin/git-patch/README.txt index d3ed32fc6..786ae070b 100644 --- a/gstreamer-plugin/git-patch/README.txt +++ b/gstreamer-plugin/git-patch/README.txt @@ -1,6 +1,6 @@ # svt-hevc gstreamer plugin installation -1. Build and install SVT-HEVC +1. Build and install SVT-HEVC - git clone https://github.com/intel/SVT-HEVC - cd SVT-HEVC - mkdir build && cd build && cmake .. && make -j `nproc` && sudo make install @@ -20,6 +20,6 @@ >> Gstreamer is now built with svt-hevc, sample command line: - gst-launch-1.0 videotestsrc ! svthevcenc ! fakesink - gst-launch-1.0 videotestsrc num-buffers=100 ! svthevcenc ! h265parse ! qtmux ! filesink location=test.mp4 ->> If you have Gstreamer already installed, run the 'gst-uninstalled' script that lets you enter an uninstalled development environment before using the command line: +>> If you have Gstreamer already installed, run the 'gst-uninstalled' script that lets you enter an uninstalled development environment before using the command line: - ninja -C build uninstalled